【发布时间】:2017-03-30 08:00:06
【问题描述】:
male(jerry).
male(stuart).
male(warren).
male(peter).
female(kather).
female(maryalice).
female(ann).
brother(jerry,stuart).
brother(jerry,kather).
brother(peter, warren).
sister(ann, maryalice).
sister(kather,jerry).
parent_of(warren,jerry).
parent_of(maryalice,jerry).
我得到了上述事实,我需要使用谓词 parent_of 定义一个规则。是的,和上面由parent_of定义的事实是同一个谓词。
假设我有一个 sibling(X, Y) 规则,它将返回所有正确的兄弟对。
我将parent_of(X, Y) 规则写为parent_of(X, Y) :- parent_of(X, A), sibling(A, Y).
但是,这个实现会导致我进入一个无限循环。
有没有办法定义规则parent_of(X, Y) 使其返回
(warren, jerry),
(warren, stuart),
(warren, kather),
(maryalice, jerry),
(maryalice, stuart),
(maryalice, kather)
我也试过了
parent_of(X, Y) :-
parent_of(X, jerry),
brother(jerry, Y).
我可以通过这种方式得到正确的答案,但最终出现“Out of local stack”错误。除此之外,我认为这个规则不好,因为我是硬编码的。
我看到了一些建议,例如将规则名称更改为其他名称,例如 another_parent_of(X, Y)。它确实解决了这个问题,但我需要使用相同的谓词来定义它。
非常感谢任何帮助。
已编辑
本练习的目的是编写规则,以便您可以完成此家谱,尽管只给出了最少的事实。如您所见,它仅说明 Warren 是 Jerry 的父亲,而从兄弟姐妹的事实来看,我们知道 Jerry 是 Stuart 和 Kather 的兄弟。所以我会有一个规则,parent_of(X, Y) 来推断 Warren 也是 Stuart 和 Kather 的父亲,尽管这在上面的事实中没有说明。
主要关心的是如何编写我的parent_of(X, Y) 规则以避免它陷入无限循环。
【问题讨论】:
标签: prolog