1

学校のプロローグを使用して論理パズルを解くことに取り組んでいます。手がかりは次のとおりです。

  1. ブラウン、クラーク、ジョーンズ、スミスは、必ずしもそれぞれではありませんが、技術者、銀行家、医師、弁護士としてコミュニティに奉仕する 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 のすべての条件を満たすために必要な事実を省略したのか疑問に思っています。

4

1 に答える 1

1

bettergolfer(G3,younger(_,A6))... Prolog では、このようには機能しません。代わりに、これを持ってください

   (  member( X,L), age(X,AX), golf(X,GX),
      (  younger(AX,A6) -> better_golfer(G3,GX) ; true )),
   .....

age( [_,_,_,A,_,_],A).
golf([_,_,_,_,_,G],G).
.....

これは、ブラウンより若いすべての人 (なしを含む) は、彼よりも貧しいゴルファーでなければならないことを意味します。

ここにも落とし穴があります。ブラウンよりも若い男性について言われているので、少なくとも 1 人のそのような男性が存在する必要があることを意味します (含意の数学的定義とは異なります)。これもコーディングする必要があります。例えば、

    ( member(X,L), age(X,AX), younger(AX,A6) -> true ),
    .....

(もちろん、新しい logvars には一意の名前を使用します)。に対して同じ変換を行う必要がありますricher(M3,older(_,A3))

ところで、生成的な方法で定義された比較述語を持つという素晴らしいアイデア:

poorer(1,2). 
poorer(1,3). 
poorer(1,4). 
poorer(2,3). 
poorer(2,4). 
poorer(3,4).
richer(A,B):- poorer(B,A)

それらを算術比較として定義すると、poorer(A,B):- A<B.インスタンス化されていない変数で問題が発生する可能性があります (最近ここで説明したように)。

于 2013-11-19T20:37:18.520 に答える