私はSWI-Prologを使っていくつかの相互再帰制約を解決しようとしています。これらの制約は比較的簡単ですが、これらの述語のいずれかを照会することは無限再帰につながる:Prologで相互再帰制約を解く
%If X is an animal, then X is a bird or a mammal, and vice-versa.
animal(X) :-
(mammal(X);bird(X)),
(male(X);female(X)).
male(X) :- animal(X).
female(X) :- animal(X).
bird(X) :- (X='parrot';X='pigeon'),animal(X).
mammal(X) :- (X='cat';X='dog'),animal(X).
彼ら非再帰的にすることなくPrologで、これらの制約を解決することができるでしょうか?
私はいくつかの基本例と同様のプログラムを書いたが、クエリmammal(X),bird(X)
はまだ代わりにfalse
を返すの無限再帰につながる:再帰的な制約を解決
%If X is an animal, then X is a bird or a mammal, and vice-versa.
animal(X) :-
(mammal(X);bird(X)).
bird('parrot').
bird('pigeon').
bird(X) :- (X='parrot';X='pigeon'),animal(X).
mammal('cat').
mammal('dog').
mammal(X) :- (X='cat';X='dog'),animal(X).
あなたはプロローグ述語が返されないことを実現関数のような値は、そうですか?だから 'dif(哺乳類(X)、鳥(X))'はおそらくあなたが思っていることをしません。実際には、「哺乳動物(X)」と「鳥(X)」という言葉は常に「X」で必ずしも異なるため、常に成功するでしょう。スコットが彼の "答え"で指摘するように、あなたは事実や基本事例を持っていません。 – lurker
@lurkerはい、この場合、 'dif/2'述語は重複しています。私はこの問題を解決するためにプログラムを編集しました。 –
彼らは冗長ではありませんでした。彼らは誤って使用された。 :pあなたの既存のロジックは、スコットが指摘しているように基本ケースが欠けているだけでなく、円形です。 「動物/ 1」は、「男性/ 1」、「女性/ 1」、および「哺乳類/ 1」という用語で定義される。また、「男性/ 1」、「女性/ 1」、「哺乳動物/ 1」は「動物/ 1」で定義される。 – lurker