%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% GOAT and CABBAGE in BMAP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% by DFP (2007-2009) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Call as %%% :-bmap(23) %%% left_ffc 0.031s %%% leftmost 0.141s %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ogg(goat). ogg(cabbage). ogg(wolf). ogg(man). riverside(0). %%% left riverside(1). %%% right pos(X) :- riverside(X). pos(2). %%% 2 boat %%%%%%%%%%%%%%%%%%%%% fluent(is_in(X),0,2) :- ogg(X). fluent(boat_in,0,1). fluent(all_alive,0,1). %%%%%%%%%%%%%%%% agent(man). action([man], cross(A,B)) :- riverside(A),riverside(B), neq(A,B). action([man], boarding(A)) :- ogg(A). action([man], alighting(A)) :- ogg(A). %%%%%%%%%%%%%%% executable([man], cross(A,B),[boat_in eq A,is_in(man) eq 2]) :- riverside(A),riverside(B), neq(A,B). executable([man], boarding(A),[boat_in eq L, is_in(A) eq L]) :- ogg(A),riverside(L). executable([man], alighting(A),[is_in(A) eq 2]) :- ogg(A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% causes( boat_in eq B, [actocc([man],cross(A,B))]):- action([man], cross(A,B)). causes(is_in(A) eq 2,[actocc([man],boarding(A))]) :- action([man], boarding(A)). causes(is_in(A) eq L,[boat_in eq L,actocc([man],alighting(A))]) :- action([man], alighting(A)), riverside(L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% initially(boat_in eq 0). initially(is_in(A) eq 0) :- ogg(A). initially(all_alive eq 1). %%%%%%%%%%%%%%% goal(is_in(A) eq 1) :- ogg(A). goal(all_alive eq 1). %%%% At most one (plus the man) in boat caused([is_in(A) eq 2, is_in(B) eq 2], all_alive eq 0) :- ogg(A),ogg(B),diff(A,B,man). %%% goat and cabbage OR wolf and goat never alone caused([is_in(wolf) eq L, is_in(goat) eq L, is_in(man) neq L], all_alive eq 0) :- pos(L). caused([is_in(cabbage) eq L, is_in(goat) eq L, is_in(man) neq L], all_alive eq 0) :- pos(L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%