Skip to content

Commit d83308d

Browse files
committed
add wolfsheepcabbage examples
1 parent a359d15 commit d83308d

File tree

3 files changed

+136
-0
lines changed

3 files changed

+136
-0
lines changed

clpfdwsc.pl

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
:- module(clpfdwsc, [go/1]).
2+
3+
:-use_module(library(clpfd)).
4+
5+
go(M) :-
6+
wsc([[0,0,0,0]], M),
7+
flatten(M, FM),
8+
label(FM).
9+
10+
wsc([[1,1,1,1]|R], [[1,1,1,1]|R]).
11+
wsc([[F,W,S,C]|R], M) :-
12+
[NF, NW, NS, NC] = NM,
13+
NM ins 0..1,
14+
NF #\= F, % move the farmer
15+
% move max one thing
16+
NW #= W #/\ NS #= S #\/
17+
NS #= S #/\ NC #= C #\/
18+
NW #= W #/\ NC #= C,
19+
% game rules
20+
NS #= NC #==> NF #= NS,
21+
NW #= NS #==> NF #= NW,
22+
wsc([NM, [F,W,S,C] | R], M).
23+

tabledwsc.pl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
go(Moves) :-
2+
wsc(0,0,0,0, Moves).
3+
4+
:- table wsc(_, _, _, _, lattice(shortest/3)).
5+
6+
shortest(P1, P2, P):-
7+
length(P1, L1),
8+
length(P2, L2),
9+
( L1 < L2 -> P = P1 ; P = P2 ).
10+
11+
% wsc/5, c/4, safe/3 are the same as OP's code, slightly reformatted.
12+
13+
wsc(1,1,1,1, []). % goal
14+
wsc(0,W,S,C, [lr(f) | Rest]) :- % farmer moving alone
15+
c(0,W,S,C),
16+
wsc(1,W,S,C, Rest).
17+
wsc(1,W,S,C, [rl(f) | Rest]) :-
18+
c(1,W,S,C),
19+
wsc(0,W,S,C, Rest).
20+
wsc(0,0,S,C, [lr(w) | Rest]) :- % move wolf
21+
c(0,0,S,C),
22+
wsc(1,1,S,C, Rest).
23+
wsc(1,1,S,C, [rl(w) | Rest]) :-
24+
c(1,1,S,C),
25+
wsc(0,0,S,C, Rest).
26+
wsc(0,W,0,C, [lr(s) | Rest]) :- % move sheep
27+
c(0,W,0,C),
28+
wsc(1,W,1,C, Rest).
29+
wsc(1,W,1,C, [rl(s) | Rest]) :-
30+
c(1,W,1,C),
31+
wsc(0,W,0,C, Rest).
32+
wsc(0,W,S,0, [lr(c) | Rest]) :- % move cabbage
33+
c(0,W,S,0),
34+
wsc(1,W,S,1, Rest).
35+
wsc(1,W,S,1, [rl(c) | Rest]) :-
36+
c(1,W,S,1),
37+
wsc(0,W,S,0, Rest).
38+
39+
c(F,W,S,C) :-
40+
safe(F,W,S),
41+
safe(F,S,C).
42+
43+
safe(A,A, _).
44+
safe(_,0,1).
45+
safe(_,1,0).

wolfsheepcabbage.pl

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
:- module(wsc, [go/1]).
2+
3+
go(Moves) :-
4+
allowed(A),
5+
list_to_ord_set(A, OA),
6+
wsc(0,0,0,0, OA, Moves).
7+
8+
allowed([
9+
s(0,0,0,0),
10+
s(0,0,0,1),
11+
% s(0,0,1,1),
12+
s(0,0,1,0),
13+
% s(0,1,1,0),
14+
% s(0,1,1,1),
15+
s(0,1,0,1),
16+
s(0,1,0,0),
17+
% s(1,1,0,0),
18+
s(1,1,0,1),
19+
s(1,1,1,1),
20+
s(1,1,1,0),
21+
s(1,0,1,0),
22+
s(1,0,1,1)
23+
% s(1,0,0,1),
24+
% s(1,0,0,0)
25+
]).
26+
27+
wsc(1,1,1,1, _, []). % goal
28+
wsc(0,W,S,C,A, [lr(f) | Rest]) :- % farmer moving alone
29+
c(0,W,S,C,A,NA),
30+
wsc(1,W,S,C, NA, Rest).
31+
wsc(1,W,S,C,A, [rl(f) | Rest]) :-
32+
c(1,W,S,C,A,NA),
33+
wsc(0,W,S,C, NA, Rest).
34+
wsc(0,0,S,C,A, [lr(w) | Rest]) :- % move wolf
35+
c(0,0,S,C,A,NA),
36+
wsc(1,1,S,C, NA, Rest).
37+
wsc(1,1,S,C,A, [rl(w) | Rest]) :-
38+
c(1,1,S,C,A,NA),
39+
wsc(0,0,S,C, NA, Rest).
40+
wsc(0,W,0,C,A, [lr(s) | Rest]) :- % move sheep
41+
c(0,W,0,C,A,NA),
42+
wsc(1,W,1,C, NA, Rest).
43+
wsc(1,W,1,C,A, [rl(s) | Rest]) :-
44+
c(1,W,1,C,A,NA),
45+
wsc(0,W,0,C, NA, Rest).
46+
wsc(0,W,S,0,A, [lr(c) | Rest]) :- % move cabbage
47+
c(0,W,S,0,A,NA),
48+
wsc(1,W,S,1, NA, Rest).
49+
wsc(1,W,S,1,A, [rl(c) | Rest]) :-
50+
c(1,W,S,1,A,NA),
51+
wsc(0,W,S,0, NA, Rest).
52+
53+
c(F,W,S,C,A,NA) :-
54+
safe(F,W,S),
55+
safe(F,S,C),
56+
member(s(F,W,S,C), A),
57+
ord_subtract(A, [s(F,W,S,C)], NA).
58+
59+
safe(A,A, _).
60+
safe(_,0,1).
61+
safe(_,1,0).
62+
63+
64+
65+
66+
67+
68+

0 commit comments

Comments
 (0)