我试图用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