I am working on a puzzle game called Goat Wolf Cabbage. The programming language is Prolog.
change(e,w). change(w,e). move([X,X,Goat,Cabbage],wolf,[Y,Y,Goat,Cabbage]) :- change(X,Y). move([X,Wolf,X,Cabbage],goat,[Y,Wolf,Y,Cabbage]) :- change(X,Y). move([X,Wolf,Goat,X],cabbage,[Y,Wolf,Goat,Y]) :- change(X,Y). move([X,Wolf,Goat,Cabbage],nothing,[Y,Wolf,Goat,Cabbage]) :- change(X,Y). oneeq(X,X,WW). oneeq(X,WWW,X). safe([Man,Wolf,Goat,Cabbage]) :- oneeq(Man,Goat,Wolf), oneeq(Man,Goat,Cabbage). wgc([e,e,e,e],[]). wgc(Config,[FirstMove|OtherMoves]) :- move(Config,FirstMove,NextConfig), safe(NextConfig), wgc(NextConfig,OtherMoves).
To make it work, I call length(X,7),wgc([w,w,w,w],X). and he shows the result. The problem is that it shows the first result many times, and then the second result:
X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, wolf, goat, cabbage, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; X = [goat, nothing, cabbage, goat, wolf, nothing, goat] ; false.
How to show both results only once? I tried to add! wgc character:
wgc(Config,[FirstMove|OtherMoves]) :- move(Config,FirstMove,NextConfig), safe(NextConfig), wgc(NextConfig,OtherMoves), !.
... but it only shows the first result once. Any ideas how to fix this?