Prolog:如何在血统中获得最年长和最年轻的人

时间:2017-07-27 17:10:08

标签: prolog

让我们说我有男性人口威廉姆斯和天行者家族的血统作为我的知识基础:

father(phil,tom, williams).
father(tom, bob, williams).
father(bob, robert, williams).
father(robert, steve, williams).

father(anakin, luke, skywalker)
father(luke, finn, skywalker)
father(finn, andrew, skywalker)
father( andrew, charles, skywalker)

我可以使用哪条规则来了解血统中最年长和最年轻的人?

例如

?- oldestYoungest(skywalker,X,Y)

应该返回

X = anakin
Y = charles

1 个答案:

答案 0 :(得分:4)

这适用于您的知识库(KB),看它现在的样子。

youngest(LastName, Son) :-
    father(_, Son, LastName),
    \+father(Son, _, LastName).

oldest(LastName, Father) :-
    father(Father, _, LastName),
    \+father(_, Father, LastName).

oldestYoungest(LastName, Oldest, Youngest) :-
    youngest(LastName, Youngest),
    oldest(LastName, Oldest).

您应该注意Prolog变量是大写的,常量(或事实)是小写的。

从技术上讲,这个答案发现最老的是KB中没有父亲的人,也是最年轻的人和KB中没有儿子的人。它的工作原理是因为你的KB是这样定义的。