Recursion 在Prolog中删除的第k个N次递归

Recursion 在Prolog中删除的第k个N次递归,recursion,prolog,Recursion,Prolog,我正试图在prolog中计算一个递归关系,老实说,我的脑袋快要爆炸了 我知道表亲、第n个表亲和被移除的表亲之间的关系,但我很难用这种不太常见的语言来表达我的定义;我看到过与其他帖子建立类似的关系,但它们并没有充分利用我已经建立的最佳关系 以下是我的工作关系,这些关系与实现这一目标相关 第N个表亲关系将递归到父关系N次。例如,从字面上看是你的父母,然后从该级别的兄弟姐妹中递归N次以查找任何堂兄弟姐妹 因为第N堂兄Kth移除了这个关系对我来说变得更加复杂,我完全失去了这个概念。因为有一些奇怪的事情在

我正试图在prolog中计算一个递归关系,老实说,我的脑袋快要爆炸了

我知道表亲、第n个表亲和被移除的表亲之间的关系,但我很难用这种不太常见的语言来表达我的定义;我看到过与其他帖子建立类似的关系,但它们并没有充分利用我已经建立的最佳关系

以下是我的工作关系,这些关系与实现这一目标相关

第N个表亲关系将递归到父关系N次。例如,从字面上看是你的父母,然后从该级别的兄弟姐妹中递归N次以查找任何堂兄弟姐妹

因为第N堂兄Kth移除了这个关系对我来说变得更加复杂,我完全失去了这个概念。因为有一些奇怪的事情在我的脑海中阻碍了一段清晰的关系。不管怎样,从这里开始我都有困难

下面是一些代码,我一直在为第n个表亲工作,但没有删除,关系。它不起作用,我对如何让它也起作用感到困惑,但它比不接近更接近,好吗


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。这是一个噩梦般的处理,但我能够拼凑出我想要的,更复杂的程度与你的答案。非常感谢。