2017-07-27 93 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

謝謝你的幫助! –

相關問題