2016-04-28 9 views
0

私はPrologでEinstein/Zebraパズルのより単純なバリエーションを持っています。年齢制約の検索

enter image description here

そして、私はこの可能な解決策を思い付いた:

b_setval(T_age, Var). 
friends(L) :- 
    L = [person(A1, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)], 
    : 
    : 
    member(person(_,yang,T_age+3),L), 
    member(person(_,_,18),L). 

でも述べたように、私のクエリfriends(L). - false.falseを返します。 私は何が間違っていますか?

+1

'L 'は' person(...) '(' person/3')のような用語のリストです。あなたの 'member'チェックの中には、' L 'の中に存在しない 'h(...)'のような 'L'の用語を探している人もいるので、それらは失敗します。また、あなたの 'member'チェックの中には3つの引数(*、例えば' member(h、(_、_、15)、L) ')があり、それらはエラーを生成します。 – lurker

+0

@lurker申し訳ありませんが、大きなコピー・ペースト・タイプミスです。訂正されましたが、まだ結果はありません。 –

答えて

1

@lukerの答えに従った後、あなたはあなたの答え

friends(L) :- 
    % 1 
    L = [person(ada, _, Ta), person(ama, _, _), person(ana, _, _)], 
    % 2 
    member(person(_,_,15), L), 
    member(person(_,_,17), L), 
    member(person(_,_,18), L), 
    % 3 
    member(person(_, chang, _), L), 
    % 4 
    member(person(_, yang, Ty), L), Ty is Ta + 3, 
    % 5 
    member(person(_, thatcher, 17), L). 

興味深いを確認することができ、これはこの種の問題のために奇妙である、2の結果を生成します。

+0

私の変数の命名に間違いがありましたが、ついにそれを手に入れました! –

1

顕著な潜在的な問題の1つは、LT_age+3という用語です。 Prologでは、これは算術的にインラインで評価されません。これは単に用語である'+'(T_age,3)です。したがって、リストのこのメンバーと一致する唯一の要素は、person(X, Y, <something>+3)のような用語になります。これがあなたの意図かどうかは不明です。

L = [person(A1, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)], 
member(person(ada, _,T_age),L), 
... 

プロローグはperson(A1, B1, T_age)にそれを一致させることができるので、これmember呼び出しは成功するはず:

あなたは変数が各member呼び出しでインスタンス化されている方法を見て、しかし、のは、説明の目的のために、手動でこれをやってみましょうするtraceを行うことができますリストにはA1 = adaを統一します。

member(person(ama, _, _),L), 
... 

これは最初のメンバーと一致することはできませんが、A2 = amaを統一することにより、第2に一致することができます。次のmember呼び出しに移る

[person(ada, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)] 

:リストLは今のように見えます。 Lは今:

[person(ada, B1, T_age), person(ama, B2, C2), person(A3, B3, T_age+3)] 

次に、あなたが持っている:

member(person(ana, _, _),L), 

は、これが第一または第二のメンバーを一致させることはできませんが、A3 = anaを統一することにより、第三を一致させることができます。 Lは今です:

[person(ada, B1, T_age), person(ama, B2, C2), person(ana, B3, T_age+3)] 

member呼び出しは次のとおりです。

B1 = changを統一することで、再び最初のメンバーを一致させることができます
member(person(_,chang, _),L), 

、そうLは次のようになります。そして、

[person(ada, chang, T_age), person(ama, B2, C2), person(ana, B3, T_age+3)] 

member(person(_,yang,T_age+3),L), 

これは、B2 = yangC2 = T_age+3を統合してリストの2番目の要素と一致します。Lは、次のようになります。そして、

[person(ada, chang, T_age), person(ama, yang, T_age+3), person(ana, B3, T_age+3)] 

member(person(_,thatcher,17),L), 

あなたはいくつかの問題を持っている場所です。 2番目の引数のため、Lの最初の2つの要素と一致することはできません。 3番目の引数17は、Lという3番目の要素のT_age+3という語句と一致しません。覚えておいてください:Prologはこれを式T_age+3 = 17として解けません。それは原子の整数として17を見るだけで、2つの引数を持つ用語としてT_age+3を参照し、一致しないことがわかります。したがって、このmember呼び出しは失敗し、述部全体が失敗します。

+0

私の意図は、他の人よりも3歳以上の年齢にマッチさせることです!私のコンセプトは今はっきりしています!私は可能な人の出力を得ることができるように、解決策を達成するための可能な方法を提案できますか?どうもありがとう! –

+0

あなたの提案に基づいて別のバージョンを投稿しましたが、これもうまくいきません:( –

+0

@jeetそれはただ失敗するのですか?私の元の質問に答えたと思うので、その質問に対する私の答えが受け入れられれば、おそらくそれを受け入れることができます:)あなたの更新では、 'member(person(_、yang、Y)、YはX + 3 、L).'は 'member/2'に3つの引数を渡しているのでエラーです。また、。 'Y is X + 3'はこの文脈では用語(' is(+(X、3)、L) ')として解釈されます。私の答えで述べたように、Prologは、特定の算術評価を使用しない限り、式をインラインで評価しません。 – lurker