Prolog - Step Siblings的链规则

时间:2014-07-25 05:03:42

标签: prolog

我是Prolog的新手,并且有一个关于为分享“共同父母”的兄弟姐妹编写“连锁规则”的问题。

在我的程序中,我假设存在父(X,Y)这一事实,断言X是Y的父级。

我需要一个规则链(X,Y,L):如果X是Y的祖先,则L是列表包含X,Y和Y的所有祖先,它们也是X的后代,按年龄的降序列出(最早的)。换句话说,我的列表应该包含所有 链接一个人与祖先的人。

例如:如果链(peter,mary,[peter,paul,sue,mary]),则 peter paul paul sue 的父级, sue mary 的父级>

注意:我熟悉 stepSibling(a,b)关系,他们的关系通过他们的父母合作伙伴(X,Y)来证明;兄弟姐妹 a b 各自父母的孩子,通过关系孩子(a,X)子(b,Y)即可。 因此;我只对那些两个兄弟姐妹共享一个共同的父母的关系感到困惑。 ie。儿童关系可能如下所示:儿童(a,X)儿童(b,X)

1 个答案:

答案 0 :(得分:0)

这是我们在早期Prolog课程中讨论的常见家谱问题的有趣转折。我们首先考虑简化,如果X是Y的祖先,则ancestor(X,Y)为真。

所以你有一个谓词parent(X,Y),它说X是Y的父。你可以这样写ancestor/2

% base case: your parent is an ancestor
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).

使用这样的示例数据库,它应该可以正常工作:

parent(peter, paul).
parent(paul, sue).
parent(sue, mary).

这适用于像ancestor(peter, mary)这样的查询,它接近您想要的内容。下一步是保留链,看起来像这样:

chain(X, Y, [X,Y])     :- parent(X, Y).
chain(X, Z, [X|Chain]) :- parent(X, Y), chain(Y, Z, Chain).

这似乎有效:

?- chain(peter, mary, X).
X = [peter, paul, sue, mary] ;
false.

我担心,因为你的问题提到了兄弟姊妹,链条应该包括其他人。这只是糠或你还有其他要求吗?如果是这样,它们并未反映在您的示例中,因此我可能需要您通过其他详细信息来增加您的问题。