2

こんにちは、解決できない問題があります。私はプロローグの新人で、これらの家系図の例をたくさん見てきましたが、私の問題に対処しているようには見えません。

私が持っていると言う

son(X, Y) :-
   \+daughter(X, Y),
   father(Y, X).

father(Y, X) :-
   male(X),
   son(X, Y).

そのうちの 1 つを呼び出すと、それぞれが前の条件を満たしているため、条件間を行ったり来たりするため、ローカル スタック エラーが発生します。

ほとんどの人は定義の 1 つを削除することを推奨しているようですが、私は父と息子の質問に答える必要があります。助けてください、これはとても単純に思えますが、私には理解できません。一度ループした後にどうすればブレークできますか?

ティア

4

1 に答える 1

2

あなたは出来る:

1) ラッパー述語を使用できます。

father(Y,X):-
   male(X),
   son_data(X,Y).

son(X,Y):-
   son_data(X,Y).
son(X,Y):-
   \+daughter(X, Y), 
    father(Y, X).

データベースは次のようになります

son_data(mike,steph).
....
father(nick,john).
....

(息子なし/2回エントリー)

2) テーブル化をサポートするプロローグ バージョン( XSB など) を使用する (またはそれを実装する; あまり良い考えではありません)

于 2012-06-29T18:59:23.760 に答える