我需要一个递归函数来查找家谱中的所有血缘关系。但老实说,我不知道如何在 Prolog 中实现这一点。
我目前对解决方案的理解是在当前分支中搜索匹配项,如果没有匹配项则继续下一个分支。
例如:
Peter
Alf, Bert
Sam, Tom, George, Sally
要检查 Tom 和 sam 是否相关,我们只需通过查找所有兄弟元素来检查第一个分支(检查父元素并检查所有子元素)。
当我们迭代树时,这个逻辑就会应用。例如,要查看 Sally 和 Tom 是否相关,首先我们检查他们是否是兄弟姐妹,如果不是,则检查他们父母的兄弟姐妹等等。
我确实有诸如 cousin、uncle 等谓词可以检查这样的事情,但问题是可伸缩性。为曾曾祖父创建谓词似乎是不合逻辑的,因为我可以使用某种递归来检查它们是否与血缘有关。
提前致谢 :)
编辑:
以下是一些基本事实/谓词来说明我正在接近的角度:
woman(sally).
woman(betty).
man(john).
man(tom).
parent(tom, john).
parent(sally, betty).
sibling(A, B) :-
parent(C, A),
parent(C, B),
A \= B.
我有更多用于树的内容,但我认为它们与这个问题无关。