【发布时间】:2016-07-22 20:11:38
【问题描述】:
我正在尝试使用 SWI-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).
【问题讨论】:
-
您意识到 prolog 谓词不会像函数那样返回值,对吧?所以
dif(mammal(X), bird(X))并没有像你认为的那样做。事实上,它总是会成功,因为mammal(X)和bird(X)对于任何X而言总是必然不同。正如斯科特在他的“回答”中指出的那样,您没有任何事实或基本案例。 -
@lurker 是的,
dif/2谓词在这种情况下是多余的。我编辑了程序来纠正这个问题。 -
它们不仅仅是多余的。他们被错误地使用了。 :p 您现有的逻辑,除了斯科特指出的缺少基本情况外,是循环的。
animal/1定义为 lfmale/1、female/1和mammal/1。而male/1、female/1和mammal/1是根据animal/1定义的。 -
@lurker 我再次更新了问题,即使添加了几个基本案例,我也遇到了同样的问题。
-
新逻辑仍然循环。
mammal根据animal定义,animal根据mammal定义。
标签: recursion prolog constraint-programming