86 lines
1.7 KiB
Plaintext
86 lines
1.7 KiB
Plaintext
|
|
||
|
:- object(miss_cann,
|
||
|
instantiates(heuristic_state_space)).
|
||
|
|
||
|
|
||
|
:- info([
|
||
|
version is 1.1,
|
||
|
authors is 'Paulo Moura',
|
||
|
date is 2000/11/21,
|
||
|
comment is 'Missionaries and cannibals heuristic state space search problem.']).
|
||
|
|
||
|
|
||
|
:- uses(loop).
|
||
|
|
||
|
|
||
|
initial_state(start, ((3,3), left, (0,0))).
|
||
|
|
||
|
|
||
|
goal_state(end, ((0,0), right, (3,3))).
|
||
|
|
||
|
|
||
|
print_state(((Me,Ce), B, (Md,Cd))) :-
|
||
|
loop::forto(1, Me, write('M')),
|
||
|
loop::forto(1, Ce, write('C')),
|
||
|
(B = left ->
|
||
|
write('.<__>..........')
|
||
|
;
|
||
|
write('..........<__>.')),
|
||
|
loop::forto(1, Md, write('M')),
|
||
|
loop::forto(1, Cd, write('C')),
|
||
|
nl.
|
||
|
|
||
|
|
||
|
next_state(((Me,Ce),left,(Md,Cd)), ((Me2,Ce2),right,(Md2,Cd2)), 1) :- %mm
|
||
|
Me >= 2,
|
||
|
once((Me - 2 =:= 0; Me - 2 >= Ce)),
|
||
|
Cd =< 2,
|
||
|
Me2 is Me - 2,
|
||
|
Ce2 is Ce,
|
||
|
Md2 is Md + 2,
|
||
|
Cd2 is Cd.
|
||
|
|
||
|
next_state(((Me,Ce),left,(Md,Cd)), ((Me2,Ce2),right,(Md2,Cd2)), 2) :- %m
|
||
|
Me >= 1,
|
||
|
once((Me - 1 =:= 0; Me - 1 >= Ce)),
|
||
|
Cd =< 1,
|
||
|
Me2 is Me - 1,
|
||
|
Ce2 is Ce,
|
||
|
Md2 is Md + 1,
|
||
|
Cd2 is Cd.
|
||
|
|
||
|
next_state(((Me,Ce),left,(Md,Cd)), ((Me2,Ce2),right,(Md2,Cd2)), 1) :- %cc
|
||
|
Ce >= 2,
|
||
|
once((Md >= Cd + 2; Md =:= 0)),
|
||
|
Me2 is Me,
|
||
|
Ce2 is Ce - 2,
|
||
|
Md2 is Md,
|
||
|
Cd2 is Cd + 2.
|
||
|
|
||
|
next_state(((Me,Ce),left,(Md,Cd)), ((Me2,Ce2),right,(Md2,Cd2)), 2) :- %c
|
||
|
Ce >= 1,
|
||
|
once((Md >= Cd + 1; Md =:= 0)),
|
||
|
Me2 is Me,
|
||
|
Ce2 is Ce - 1,
|
||
|
Md2 is Md,
|
||
|
Cd2 is Cd + 1.
|
||
|
|
||
|
next_state(((Me,Ce),left,(Md,Cd)), ((Me2,Ce2),right,(Md2,Cd2)), 1) :- %mc
|
||
|
Me >= 1,
|
||
|
Ce >= 1,
|
||
|
Md >= Cd,
|
||
|
Me2 is Me - 1,
|
||
|
Ce2 is Ce - 1,
|
||
|
Md2 is Md + 1,
|
||
|
Cd2 is Cd + 1.
|
||
|
|
||
|
next_state(((Me,Ce),right,(Md,Cd)), ((Me2,Ce2),left,(Md2,Cd2)), Cost) :-
|
||
|
next_state(((Md,Cd),left,(Me,Ce)), ((Md2,Cd2),right,(Me2,Ce2)), Cost).
|
||
|
|
||
|
|
||
|
heuristic(((_, _), _, (Md, Cd)), Cost) :-
|
||
|
Cost is 6 - (Md + Cd).
|
||
|
|
||
|
|
||
|
:- end_object.
|