2

私のPrologプログラムblanket(X,Y)には、Xが特定の種類のYのセットに含まれているかどうかをチェックするというルールがあります。

  • Yの両親
  • Yの子供たち
  • Yの共同養育

私はそれを次のように定義しました:

blanket(Y,X) :- different(Y,X),parent(Y,X);child(Y,X);coparent(Y,X).

ただし、これは期待どおりに機能しません。Xの親、子、および共同養育者(存在する場合)を正しく識別しますが、それ自体を親と共同養育者の両方としてリストします。これは私が望んでいないことです。different(Y,X)評価が最初に独立して行われるように、ある種の順序を設定することは可能ですか?もちろん、 :のようなものを試しましdifferent(Y,X),(parent(Y,X);child(Y,X);coparent(Y,X)).たが、まだ言語に慣れていないため、構文エラーが発生します。

任意の提案をいただければ幸いです。

編集:ここに、、、childおよびdifferent関係coparentがあります:

child(X,Y) :- parent(Y,X).

different(X,Y) :- not(X == Y).

coparent(Y,X) :- parent(Y,Z),parent(X,Z).

完全を期すために。

4

2 に答える 2

0
blanket(Y,X) :- different(Y,X), parent(Y,X).
blanket(Y,X) :- different(Y,X), child(Y,X).
blanket(Y,X) :- different(Y,X), coparent(Y,X).
于 2013-01-30T14:54:26.370 に答える
0

問題はあなたの共同養育の定義です。これは、有効な結果としてそれ自体を返すことを許可するステートメントです。

たとえば、次のように再定義することをお勧めします。

coparent(Y,X) :- parent(Y,Z),parent(X,Z), X \= Y.

このようにして、次のことができます。

blanket(Y,X) :-parent(Y,X);child(Y,X);coparent(Y,X).

もちろん、「coparent」の定義を維持し、ブランケットを次のように変更することしかできません。

blanket(Y,X) :-parent(Y,X);child(Y,X);(coparent(Y,X), X\=Y).
于 2015-05-24T17:46:28.303 に答える