論理パズルを解く Prolog プログラムを書いています。回答を印刷しようとすると、すべての回答に対して同じ回答が得られます。論理パズルの答えは次のとおりです。
- ジュヌビエーブはサイズ 4 のマンザリータを購入しました
- lucia はサイズ 7 の Graaffetz を購入しました
- ショーナはサイズ 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 はジュヌビエーブに等しく、Y は 4 に等しく、Z は修道院長の丘に等しい。
そして、たとえば、tell(vanessa,Y,Z) のように変数の 1 つを指定すると、次のように出力されます。Y と Z の値は同じままにします。