%% Ute Schmid, April 1996
%% basierend auf einem Programm von Sylvia Wiebrock
% Beschreibung zu dem Affe-und-Bananen Problem:
% Zustandsvektor: s( Affe , Worauf , Box , Hat_Bananen )
% Startzustand: s( atdoor , onfloor , atwindow , hasnot )
% Zielzustand: s( ? , ?, ? , has )
% Variante mit Vermeidung von Hin- und Herlaufen
% reachable/2 definiert die zulaessigen Positionen und legt die
% Erreichbarkeit fest.
reachable(atdoor, middle).
reachable(middle, atwindow).
reachable(atwindow, middle).
reachable(middle, atdoor).
% Aktionen:
action(_Last, s(middle, onbox, middle, hasnot),
grasp, s(middle, onbox, middle, has)).
action(_Last, s(P, onfloor, P, H),
climb, s(P, onbox , P, H)).
action(Last, s(P1, onfloor, P1, H),
push(P1, P2), s(P2, onfloor, P2, H)) :-
reachable(P1,P2),
not P1=P2, % sinnlose Aktion
not Last=push(P2, P1). % Zyklenvermeidung
action(Last, s(P1, onfloor, B, H),
walk(P1, P2), s(P2, onfloor, B, H)) :-
reachable(P1,P2),
not P1=P2, % sinnlose Aktion
not Last=walk(P2,P1). % Zyklenvermeidung
% Aufruf mit reach(s(atdoor,onfloor,atdoor,hasnot),
% s(P1,P2,P3,has),start)
reach(s(P1, P2, P3, has), s(P1, P2, P3, has), _).
reach(State1, State2, Last) :-
action(Last, State1, Action, IntermediateState),
reach(IntermediateState, State2, Action).