Affe-Banane Problem in Prolog

save [monkey.pl]

__________________________________________________________________


%% 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).