2016-11-09 75 views
0
family( 
    person(pat,  marx, date(10, march, 1944), unemployed), 
    person(charlotte, marx, date(11, february,  % ... etc 
). 

找到每個人的名字和姓氏,並給他們的收入(你可以使用提供的薪水/ 2謂詞,它返回每個人的收入數字,無論他們是否在工作)。此外,請指出每個工作人員的「收入狀況」爲 就業,失業或退休。然而PROLOG知識庫

香港專業教育學院這樣做它不工作:

status(person(_,_,_,works(_,S)),WorkStatus). 
status(person(_,_,_,unemployed),WorkStatus). 
status(person(_,_,_,retired),WorkStatus). 

question6(Name,Surname,Income,Status) :- 
    exists(person(Name, Surname, Date, WorkStatus)), 
    salary(person(Name, Surname, Date, WorkStatus),Income), 
    status(WorkStatus,Income). 

回答

0

你似乎有點困惑如何統一的作品。例如,您對status的定義全部包含singleton variables

由於這看起來明顯像功課,(也因爲你沒有提供重要的謂詞,如works/2),我只是給你一個指示,讓你開始。

說你有你的源文件:

person(john, smith, date(01, jan, 1970), unemployed). 
status(person(_,_,_,unemployed), unemployed). % <-- note the second argument! 

status的定義中指出,如果它與第一個參數叫做這是一個personunemployed,那是字面unemployed第二個參數,那麼status將返回true。

status可以有多個定義的事實基本上意味着「有多種方法可以使其返回true」。但現在讓我們假裝我們只有這個。

在查詢時間,任何用變量替換的術語會要求prolog嘗試將它們與它已知的內容統一起來,並查看是否有任何可以使status爲真的統一。

例如,下面的查詢將作爲執行如下:

?- X = person(john,_,_,_), status(X, Y). 
X = person(john, _G2392, _G2393, unemployed), 
Y = unemployed. 

(即發現,如果有任何person稱爲john,如果是的話,是有Y的值將使status斷言是真的嗎?答案是肯定的,因爲考慮到我們的人恰好失業,那麼設定Y =失業,滿足我們對上述status的定義。)