#program initial. % Some types group(mis;can). bank(l;r). opposite(l,r). opposite(r,l). action(move(M,C)) :- M=0..2, C=0..2, M+C<3, M+C>0. % Initial state h(n(G,l),3) :- group(G). h(n(G,r),0) :- group(G). h(boat,l). #program dynamic. % Action generation 1 {o(A) : _action(A) } 1. % Auxiliary (action attributes) moved(mis,M) :- o(move(M,C)). moved(can,C) :- o(move(M,C)). % Executability axioms :- moved(G,N), 'h(boat,B), 'h(n(G,B),M), N>M. % Effect axioms h(n(G,B),M+N) :- 'h(n(G,B),M), h(boat,B), moved(G,N). h(n(G,B),M-N) :- 'h(n(G,B),M), 'h(boat,B), moved(G,N). h(boat,B1) :- 'h(boat,B), _opposite(B,B1). #program always. % Missionaries not outnumbered by cannibals :- h(n(mis,B),M), h(n(can,B),C), C>M, M>0. #program final. :- not goal. goal :- h(n(mis,r),3), h(n(can,r),3). #show o/1. % We only show performed actions