学校のプロローグを使用して論理パズルを解くことに取り組んでいます。手がかりは次のとおりです。
ブラウン、クラーク、ジョーンズ、スミスは、必ずしもそれぞれではありませんが、技術者、銀行家、医師、弁護士としてコミュニティに奉仕する 4 人の実質的な市民です。
ジョーンズより保守的だがスミスよりリベラルなブラウンは、彼より年下の男性よりもゴルフが上手で、クラークより年上の男性よりも収入が多い.
建築家より稼いでいる銀行家は、最年少でも最年長でもない。
医者は弁護士よりもゴルフが下手ですが、建築家ほど保守的ではありません。
予想通り、最年長の男性が最も保守的で最も収入が多く、最年少の男性が最高のゴルファーです。
それぞれの職業は?
ヒント: 天候、能力、相対年齢などで人をランク付けするには、1、2、3、4 の数字を使用します。これにより、比較のコーディングが容易になります。
(以下のように) コーディングするには、手がかりによって与えられたすべての関係をリストのリストとして解釈します。各リストは、
%[profession,surname,politics,relative_age, relative_salary, golf_ability]:
profession(L) :- L = [[_,'Brown',_,_,_,_],[_,'Jones',_,_,_,_],[_,'Clark',_,_,_,_],
[_,'Smith',_,_,_,_]],
member([_,'Brown',P1,A6,M3,G3],L),
member([_,'Jones',P2,_,_,_],L),
member([_,'Clark',_,A3,_,_],L),
member([_,'Smith',P3,_,_,_],L),
moreconservative(P1,P2),
moreliberal(P1,P3),
bettergolfer(G3,younger(_,A6)),
richer(M3,older(_,A3)),
member(['banker',_,_,A1,M1,_],L),
member(['architect',_,P5,_,M2,_],L),
richer(M1,M2),
(A1 = 2;A1 = 3),
member(['doctor',_,P4,_,_,G1],L),
member(['lawyer',_,_,_,_,G2],L),
worsegolfer(G1,G2),
moreliberal(P4,P5),
member([_,_,4,4,4,_],L),
member([_,_,_,1,_,4],L).
relative_politics、relative_salary、relative_age、および golf_ability の関係を次のように定義します。
例えば:
richer(4,1).
moreconservative(4,1).
poorer(1,4).
poorer(1,3).
そして、それはすべての関係に続きます。
すべての手がかりをプロローグに忠実に翻訳したと思いますが、データベースにクエリを実行すると失敗すると表示されます。例えば:
?- profession(L).
fail.
NU プロローグを使用しています。手がかりの翻訳を間違えたのか、それともデータベースがリスト L のすべての条件を満たすために必要な事実を省略したのか疑問に思っています。