Recursion 在Prolog中删除的第k个N次递归
我正试图在prolog中计算一个递归关系,老实说,我的脑袋快要爆炸了 我知道表亲、第n个表亲和被移除的表亲之间的关系,但我很难用这种不太常见的语言来表达我的定义;我看到过与其他帖子建立类似的关系,但它们并没有充分利用我已经建立的最佳关系 以下是我的工作关系,这些关系与实现这一目标相关 第N个表亲关系将递归到父关系N次。例如,从字面上看是你的父母,然后从该级别的兄弟姐妹中递归N次以查找任何堂兄弟姐妹 因为第N堂兄Kth移除了这个关系对我来说变得更加复杂,我完全失去了这个概念。因为有一些奇怪的事情在我的脑海中阻碍了一段清晰的关系。不管怎样,从这里开始我都有困难 下面是一些代码,我一直在为第n个表亲工作,但没有删除,关系。它不起作用,我对如何让它也起作用感到困惑,但它比不接近更接近,好吗Recursion 在Prolog中删除的第k个N次递归,recursion,prolog,Recursion,Prolog,我正试图在prolog中计算一个递归关系,老实说,我的脑袋快要爆炸了 我知道表亲、第n个表亲和被移除的表亲之间的关系,但我很难用这种不太常见的语言来表达我的定义;我看到过与其他帖子建立类似的关系,但它们并没有充分利用我已经建立的最佳关系 以下是我的工作关系,这些关系与实现这一目标相关 第N个表亲关系将递归到父关系N次。例如,从字面上看是你的父母,然后从该级别的兄弟姐妹中递归N次以查找任何堂兄弟姐妹 因为第N堂兄Kth移除了这个关系对我来说变得更加复杂,我完全失去了这个概念。因为有一些奇怪的事情在
Nth_cousin(N, M, PERSON) :-
N>0 ->
N is N-1,
is_parent_of(PARENT, PERSON),
Nth_cousin(N, M, PARENT)
; M > 0 ->
M is M -1,
is_child_of(CHILD, PERSON),
loop(N, M, CHILD)
;
这与你的例子有很大关系,因为你的名字让我困惑,我允许自己使用另一个来自辛普森一家的家谱: factbase只是家谱的一部分:
is_child_of(bart, homer).
is_child_of(bart, marge).
is_child_of(lisa, homer).
is_child_of(lisa, marge).
is_child_of(maggie, homer).
is_child_of(maggie, marge).
is_child_of(marge, jackie).
is_child_of(patty, jackie).
is_child_of(selma, jackie).
is_child_of(ling, selma).
这里有两个注意事项:的是子项\u足以描述大多数家谱。无需添加另一个事实,如(荷马,赫伯)的是兄弟姐妹,因为它可以通过是谓词的子对象来表示,的规则是的兄弟姐妹。您应该将事实谓词和规则谓词分开,否则您的代码很快就会变得混乱,因为您需要包含特殊情况
让我们从兄弟姐妹开始:
is_sibling_of(X, Y) :-
is_child_of(X, Z),
is_child_of(Y, Z).
nth_cousin_of(Kid1,Kid2,N) :-
nth_anchestor_of(Kid1,Xparent1,N),
nth_anchestor_of(Kid2,Xparent2,N),
is_sibling_of(Xparent1,Xparent2).
这是一个很好的开始,但是有了这个规则,我可以成为我自己的兄弟姐妹,所以添加一个不相等的值。请注意:不等运算符\=
对于不同的Prolog解释器可能会有所不同
is_sibling_of(S1,S2) :-
is_child_of(S1, P),
is_child_of(S2, P),
S1\=S2.
接下来是一个泛型谓词。父母是一年级的学生,祖父母是二年级的学生,依此类推。这个想法是通过递归来编程的:对于一年级来说很难定义,所有其他年级都是通过中间人来定义自己的,在我的例子中是孩子的父母。所以我的anchestor 3级是我妈妈的anchestor 2级,她妈妈的anchestor 1级
nth_anchestor_of(Child,Xparent,1) :-
is_child_of(Child, Xparent).
nth_anchestor_of(Child,Xparent,N) :-
NN is N-1, NN>0,
is_child_of(Child, InBetween),
nth_anchestor_of(InBetween,Xparent,NN).
现在,它只是向N级表亲迈出了一小步。这一定义如下:N级表亲有N级的Anchestor,它们是兄弟姐妹:
is_sibling_of(X, Y) :-
is_child_of(X, Z),
is_child_of(Y, Z).
nth_cousin_of(Kid1,Kid2,N) :-
nth_anchestor_of(Kid1,Xparent1,N),
nth_anchestor_of(Kid2,Xparent2,N),
is_sibling_of(Xparent1,Xparent2).
在我的文化中,表亲被认为是一年级:
is_cousin_of(Kid1,Kid2) :- nth_cousin_of(Kid1,Kid2,1).
让我们试试看
?- is_cousin_of(bart,ling).
true
?- is_cousin_of(bart,X).
X = ling;
false
?- is_cousin_of(homer,X).
false
?- is_cousin_of(ling,X).
X = bart;
X = lisa;
X = maggie;
false
?- is_cousin_of(X,Y).
X = bart,
Y = ling;
X = lisa,
Y = ling;
X = maggie,
Y = ling;
X = ling,
Y = bart;
X = ling,
Y = lisa;
X = ling,
Y = maggie;
false
就像一个符咒
请注意,添加更多家庭成员可能会导致同一表亲对的多个实例。如果你加上玛姬的父亲,最后一个问题将把所有答案加倍。您可以避免使用cuts(symbol!
),这将在更多高级课程/教程中学习。谢谢您,我们为处理此任务提供的许多资源已被弃用/删除,因为不再支持html。这是一个噩梦般的处理,但我能够拼凑出我想要的,更复杂的程度与你的答案。非常感谢。