This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/Logtalk/examples/searching/miss_cann.lgt
2001-06-06 19:40:57 +00:00

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.