我試圖用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」謂詞是多餘的。我編輯了程序來糾正這個問題。 –
他們不僅僅是多餘的。他們被錯誤地使用。 :除了斯科特指出的遺漏基礎案例外,你現有的邏輯是循環的。 「動物/ 1」用「男/ 1」,「女/ 1」和「哺乳動物/ 1」來定義。而'男/ 1','女/ 1'和'哺乳動物/ 1'則按照「動物/ 1」來定義。 – lurker