Ich lese das Buch Denken als Computation und schrieb den Code als Kapitel 9.4:Affe und Banane in Denken als Computation
plan(L) :-
initial_state(I),
goal_state(G),
reachable(I, L, G).
initial_state([]).
legal_move(S, A, [A | S]) :-
poss(A, S).
goal_state(S) :-
has_bananas(S).
reachable(S, [], S).
reachable(S1, [M | L], S3) :-
legal_move(S1, M, S2),
reachable(S2, L, S3).
location(box, loc3, []).
location(box, L, [push(L) | _]).
location(box, L, [A | S]) :-
\+ A = push(L),
location(box, L, S).
location(bananas, loc1, _).
location(monkey, loc2, []).
location(monkey, L, [push(L) | _]).
location(monkey, L, [go(L) | _]).
location(monkey, L, [climb_off | S]) :-
location(monkey, L, S).
location(monkey, L, [A | S]) :-
\+ A = push(_), \+ A = go(_), location(monkey, L, S).
on_box([climb_on | _]).
on_box([A | S]) :- \+ A = climb_off, on_box(S).
has_bananas([grab | S]) .
has_bananas([_ | S]) :- has_bananas(S).
poss(climb_off, S) :- on_box(S).
poss(go(_), S) :- \+ on_box(S).
poss(grab, S) :-
on_box(S), location(box, L, S), location(bananas, L, S).
poss(push(_), S) :- poss(climb_on, S).
poss(climb_on, S) :-
\+ on_box(S), location(box, L, S), location(monkey, L, S).
Aber ich fand, dass das Programm hört nie auf ... Nach dem Drucken des Stapels Info, ich habe festgestellt, dassListen von unendlicher Länge erzeugt. Ich habe versucht, die Länge der Listen in has_banana
has_bananas([grab | S], N) :- length(S, NS), NS is N - 1.
has_bananas([_ | S], N) :- \+ N = 0, has_bananas(S, N - 1).
die N
bezieht sich auf die Länge von L
in plan(L)
(z N
4 ist, wenn Abfrage plan([M1, M2, M3, M4])
) zu beschränken, aber es funktioniert nicht.
Gibt es eine Lösung?
'has_bananas/1' erzeugt Listen, die eine Instanz von' grab' enthalten und der Rest sind anonyme, uninstantiierte Variablen und ein uninstantiierter Tail. Ist es das, was dieses Prädikat tun soll? – lurker
Sie finden eine Lösung mit 'N = 4 ', nicht wahr? – false