Prolog-步骤同级的链规则

Prolog-步骤同级的链规则,prolog,Prolog,我是Prolog的新手,对于为共享“共同父代”的同级兄弟姐妹编写“链式规则”有疑问 在我的程序中,我假设父(X,Y)事实的存在断言X是Y的父 我需要一个规则链(X,Y,L):如果X是Y的祖先,那么L是包含X,Y和Y的所有祖先的列表,这些祖先也是X的后代,按年龄降序排列(最老的排在第一位)。换句话说,我的列表应该包含所有将一个人与一个祖先联系在一起的人 例如:如果连锁店(彼得、玛丽、[彼得、保罗、苏、玛丽]),那么彼得是保罗的父母,保罗是苏的父母,苏是玛丽的父母 注意:我熟悉继兄弟姐妹(a,b)关

我是Prolog的新手,对于为共享“共同父代”的同级兄弟姐妹编写“链式规则”有疑问

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

我需要一个规则链(X,Y,L):如果X是Y的祖先,那么L是包含X,Y和Y的所有祖先的列表,这些祖先也是X的后代,按年龄降序排列(最老的排在第一位)。换句话说,我的列表应该包含所有将一个人与一个祖先联系在一起的人

例如:如果连锁店(彼得、玛丽、[彼得、保罗、苏、玛丽]),那么彼得是保罗的父母,保罗是苏的父母,苏是玛丽的父母


注意:我熟悉继兄弟姐妹(a,b)关系,他们的关系通过父母伴侣(X,Y)来确定;其中,兄弟姐妹ab通过关系child(a,X)child(b,Y)是各自父母的子女。因此;我只是对两个继兄弟姐妹共用一个父母的关系感到困惑一种看起来像这样的儿童关系:儿童(A,X)儿童(b,X)

这是我们在早期序言课程中讨论的常见系谱问题的一种有趣的转折。让我们先考虑一个简化,<代码>祖先(x,y)< /> >如果x是y.p/p>的祖先,则是真的。 所以你有一个谓词
parent(X,Y)
,它说X是Y的父。你可以这样写
祖先/2

% base case: your parent is an ancestor
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
chain(X, Y, [X,Y])     :- parent(X, Y).
chain(X, Z, [X|Chain]) :- parent(X, Y), chain(Y, Z, Chain).
对于这样的示例数据库,它应该可以正常工作:

parent(peter, paul).
parent(paul, sue).
parent(sue, mary).
这将适用于类似于
祖先(peter,mary)
的查询,这与您想要的非常接近。下一步是保留该链,其外观如下:

% base case: your parent is an ancestor
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
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.
不过我担心,因为你的问题提到了同父异母的兄弟姐妹,而且这个链条应该包括其他人。那只是糠秕还是你有额外的要求?如果是这样,它们不会反映在您的示例中,因此我可能需要您用更多的细节来补充您的问题。

我所指的“其他”元素是关于“所有”其他成员的,这些成员也与同一祖先链相关。你上面的例子很好地回答了我的问题。例如:?-chain(彼得,玛丽,X)X=[彼得,保罗,苏,玛丽];//这正是我所指的。我也成功地运行了这个程序。谢谢你(堆!)