Prolog のテストが近づいていますが、その基本的な考え方がよくわかりません。私が経験してきた例のいくつかはある程度理解できますが、座って特定の問題を解決する方法をすぐに知ることはできません。
私たちの教授は私たちにいくつかの例を教えてくれました.
例は私たちの本から来ました:
Donna, Danny, David, and Doreen were seated at a table.
The men sat across from each other, as did the women.
They each ordered a different drink and main course.
Facts:
Doreen sat beside the person that ordered steak
The chicken came with a coke
The person with lasagna sat across from the person with milk
David never drinks coffee
Donna only drinks water
Danny could not afford to order steak
私は、各人に関連するリストがあり、事実を入力する方法を試しましたが、これは正しいアプローチではないと思います. 誰かが私にこれを説明してもらえますか? ありがとう!
編集:
これは私が最終的に得たコードです。パズルのほとんどを完成させ、前菜の1つと飲み物の1つを残しますが、それは修正可能なはずです:
sat_across([X,_,Y,_], X, Y).
sat_across([_,X,_,Y], X, Y).
sat_beside(T, X, Y) :- % this is tricky
nth1(N,T,X), nth1(M,T,Y),
(N =:= M+1 ; N =:= M-1 ; N == 1, M == 4 ; N == 4, M == 1).
not_connected(T, Place) :- \+ member(Place, T).
connected(T, Place) :- member(Place, T).
solve(T) :- T = [_,_,_,_],
sat_across(T, (danny,_,_), (david,_,_)),
sat_across(T, (donna,_,_), (doreen,_,_)),
sat_beside(T, (doreen,_,_), (_,_,steak)),
connected(T, (_,coke,chicken)),
sat_across(T, (_,_,lasagna), (_,milk,_)),
not_connected(T, (david,coffee,_)),
connected(T, (donna,water,_)),
not_connected(T, (danny,_,steak)).