6

私は SICStus Prolog を使用しており、一連の事実があります。

student('John Henry', 'Maths').
student('Jim Henry', 'Maths').
student('John Alan', 'Maths').
student('Alan Smith', 'Computing').
student('Gary Henry', 'Maths'). 

両方の学生が異なる2人の学生の共有科目を取得したいので、次のようになりました。

sharedSubject(S1, S2, Sub) :- S1 \== S2, student(S1, Sub), student(S2, Sub).

ただし、入力すると:

sharedSubject('John Henry', F, E).                     

私は得るF = 'John Henry'。誰かが私が間違っている場所と何をする必要があるかを指摘できますか? ありがとう。

4

2 に答える 2

8

dif/2代わりに を使用するか、ルールの最後に を設定します。\==これは ほど安全ではありませんdif/2。以下も参照してください。

X\=Y と dif(X,Y) の違い

Prolog の論理的な 'not' は何ですか?

\==/2 または dif/2 の使用

于 2013-11-15T21:21:12.570 に答える
7

S1 \== S2としてゴールを最後まで動かさなければなりません。sharedSubject/3のように、インスタンス化されていない 2 番目の引数で述語を呼び出すとsharedSubject('John Henry', F, E)S1 \== S2目標は常に true になります。

?- 'John Henry' \== S2.
true.

また:

?- S1 \== S2.
true.

Prolog システムのドキュメントで、標準の(\==)/2組み込み述語のドキュメントを参照してください。簡単に言うと、2 つの変数が同じかどうかをテストする場合を除き、この用語の等価述語を呼び出すときに、両方の引数がインスタンス化されていることを確認してください。

于 2013-11-15T21:22:37.987 に答える