2017-07-27 38 views
2

比方说,我有男性人口威廉姆斯和天行者家族的血统作为我的知识基础:序言:如何获得最古老和最年轻的血统

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

你有什么试过?我不得不指出,Prolog变量是以大写字母开头的,所以你的知识库基本上和'父(X,Y,Z)'一样,一遍又一遍;你应该小写这些名字或者没有什么有趣的事情会发生。 –

+0

对不起,我已修复大写字母。 –

+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是这样定义的。

+1

如果它解决了您的问题,您可以标记答案正确:) – mcansado

+0

谢谢你的帮助! –

相关问题