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