1
2 start(fluss([bauer,kohl,wolf,ziege],[])).
3 ?trans(move(X),A,B) :- kante(A,X,B).
4 prop(X,X).
5 prop(X,unsafe) :- ziel(X).
6 prop(X,h(L)) :- heuristic_function_result(X,L).
7 eats(ziege,kohl).
8 eats(wolf,ziege).
9
10 ko(List) :-
11 ? member(X,List), member(Y,List), eats(X,Y).
12
13
14
15 ?kante(fluss(L,R),X,fluss(NL,NR)) :- move(L,R,X,NL,NR).
16 ?kante(fluss(L,R),X,fluss(NL,NR)) :- move(R,L,X,NR,NL).
17
18 :- use_module(library(lists)).
19
20 ?move(L,R,bauer,SNewL,NewR) :- select(bauer,L,NewL), sort(NewL,SNewL),
21 ? \+ ko(NewL), NewR=[bauer|R].
22 ?move(L,R,bauer(X),SNewL,NewR) :- select(bauer,L,LL),
23 ? select(X,LL,NewL), \+ ko(NewL), sort(NewL,SNewL),
24 sort([bauer,X|R],NewR).
25
26 ziel(fluss([],[bauer,kohl,wolf,ziege] )).
27
28
29 animation_function_result(fluss(Left,Right),[((1,1),Left),((1,2),'~~'),((1,3),Right)]).
30 % using Unicode symbols seems to crash latest Tk version on macOS, so use this with care:
31 %animation_function_result(fluss(Left,Right),[((1,1),LL),((1,2),'~~'),((1,3),RR)]) :-
32 % translate(Left,LL), translate(Right,RR).
33
34 heuristic_function_active.
35 heuristic_function_result(fluss(L,_),Len) :- length(L,Len).
36
37
38 prob_pragma_string('ASSERT_LTL','G not(deadlock)').
39 prob_pragma_string('ASSERT_LTL','G not(e(move))'). % is FALSE
40 prob_pragma_string('ASSERT_LTL','G not({unsafe})'). % is FALSE
41
42 translate([],[]).
43 translate([H|T],[TH|TT]) :- (translate1(H,TH)->true ; TH=H), translate(T,TT).
44 translate1(wolf,'\x1f43a\').
45 translate1(kohl,'\x1F96C\').
46 translate1(ziege,'\x1F410\').
47
48 % Goat 128016 0x1F410
49 % Cabbage 129388
50 % Wolf 128058 1f43a