Prolog-不是预期的输出

Prolog-不是预期的输出,prolog,Prolog,我有一个返回后代的事实,但只有当“ascendente”是“后代”的父亲/母亲时,它才会返回。我做错了什么 %descendenteDir(homem,mulher,filho) descendenteDir('Tywin','Joanna','Ser Jaime'). descendenteDir('Tywin','Joanna','Cersei'). descendenteDir('Robert','Cersei','Joffrey'). descendenteDir('Robert','C

我有一个返回后代的事实,但只有当“ascendente”是“后代”的父亲/母亲时,它才会返回。我做错了什么

%descendenteDir(homem,mulher,filho)
descendenteDir('Tywin','Joanna','Ser Jaime').
descendenteDir('Tywin','Joanna','Cersei').
descendenteDir('Robert','Cersei','Joffrey').
descendenteDir('Robert','Cersei','Myrcella').
descendenteDir('Robert','Cersei','Tommen').
descendenteDir('Kevan','Dorna','Lancel').

descendente(Ascendente,Descendente):- descendenteDir(Ascendente,_,Descendente)
    ;descendenteDir(_,Ascendente,Descendente)
    ;descendenteDir(descendente(Ascendente,_),_,Descendente)
    ;   descendenteDir(_,descendente(Ascendente,_),Descendente).

最后一条规则中的下降部分(上升部分)不太正确。应该是这样的:

descendente(Ascendente,Descendente):- descendenteDir(Ascendente,_,Descendente)
    ;descendenteDir(_,Ascendente,Descendente)
    ;descendenteDir(X,_,Descendente), descendente(Ascendente,X)
    ;descendenteDir(_,X,Descendente), descendente(Ascendente,X).

这与用C++/Python/Java等语言调用函数和获取返回值不同。在Prolog中,您有一组事实(顶部的
downentedir
规则)和一些推理规则(
downente
规则)。在递归使用规则的定义中,必须提供一个变量,该变量将绑定到可用的值(来自事实)。该变量稍后将用于推断后续规则。这里
X
就是这个变量。Prolog将绑定不同的值,并尝试从下面的子句中推断出下一部分。

我尝试了代码,但它只返回升序的子级。糟糕,我已经有7年没有写过一行Prolog代码了,而且忘记了Prolog变量应该以大写字母开头。修好了。