顕著な潜在的な問題の1つは、L
のT_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 = yang
とC2 = 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
呼び出しは失敗し、述部全体が失敗します。
'L 'は' person(...) '(' person/3')のような用語のリストです。あなたの 'member'チェックの中には、' L 'の中に存在しない 'h(...)'のような 'L'の用語を探している人もいるので、それらは失敗します。また、あなたの 'member'チェックの中には3つの引数(*、例えば' member(h、(_、_、15)、L) ')があり、それらはエラーを生成します。 – lurker
@lurker申し訳ありませんが、大きなコピー・ペースト・タイプミスです。訂正されましたが、まだ結果はありません。 –