我正在编写一个解决逻辑难题的 Prolog 程序。当试图打印出答案时,它给了我所有答案的相同答案。逻辑难题的答案是:
- 吉纳维芙买了一个 4 号的曼扎里塔
- lucia 买了一个 7 号的 Graffetz
- 肖娜买了一件 5 号的威利福德
- vanessa 买了 6 号 Abbot Hill
我的代码如下:
customer(genevieve).
customer(lucia).
customer(shawna).
customer(vanessa).
shoesize(4).
shoesize(5).
shoesize(6).
shoesize(7).
manufactorer(abbothill).
manufactorer(manzarita).
manufactorer(graffetz).
manufactorer(williford).
solve :-
shoesize(GenevieveShoesize),
shoesize(LuciaShoesize),
shoesize(ShawnaShoesize),
shoesize(VanessaShoesize),
all_different([GenevieveShoesize, LuciaShoesize, ShawnaShoesize, VanessaShoesize]),
manufactorer(AbbotHillManufactorer),
manufactorer(ManzaritaManufactorer),
manufactorer(GraffetzManufactorer),
manufactorer(WillifordManufactorer),
all_different([AbbotHillManufactorer, ManzaritaManufactorer,
GraffetzManufactorer, WillifordManufactorer]),
List = [ [genevieve,GenevieveShoesize,AbbotHillManufactorer],
[lucia,LuciaShoesize,ManzaritaManufactorer],
[shawna,ShawnaShoesize,GraffetzManufactorer],
[vanessa,VanessaShoesize,WillifordManufactorer]],
\+(member([_,5,manzarita],List)),
\+(member([_,6,manzarita],List)),
\+(member([lucia,5,_],List)),
\+(member([lucia,6,_],List)),
\+(member([genevieve,_,abbothill],List)),
\+(member([shawna,_,graffetz],List)),
(member([vanessa,_,abbothill],List)),
tell(genevieve,GenevieveShoesize,GeneieveManufactorer),
tell(lucia,LuciaShoesize,LuciaManufactorer),
tell(shawna,ShawnaShoesize,ShawnaManufactorer),
tell(vanessa,VanessaShoesize,VanessaManufactorer).
all_different([H | T]) :- member(H,T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([]).
tell(X,Y,Z) :-
customer(X),
shoesize(Y),
manufactorer(Z),
write(X), write(' got their shoes from'),
write(Y), write(' and is a size '), write(Z), nl.
当我去 SWI 并要求它:
-tell(X,Y,Z) 它输出:X 等于genevieve,Y 等于4,Z 等于方丈山。
如果我指定变量之一,例如tell(vanessa,Y,Z),它将打印出:vanessa买了一个4号的方丈山;保持 Y 和 Z 的值相同。