| 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 |