family(
person( pat, marx, date( 10, march, 1944), unemployed),
person( charlotte, marx, date( 11, february, % ... etc
).
找出每个人的名字和姓氏并给出他们的收入(你可以使用所提供的工资/ 2谓词,它为每个人返回一个收入数字,无论他们是否在工作)。此外,将每个工作人员的“收入状态”表示为 雇用,失业或退休的人之一。
我做过这件事,但是没有用:
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 :(得分:0)
你似乎对统一如何运作感到困惑。例如,您对status
的定义都包含singleton variables。
因为这看起来像家庭作业一样明显(并且因为你还没有提供像works/2
这样的重要谓词),所以我只会给你一个指示你开始。
假设您的源文件中有:
person(john, smith, date(01, jan, 1970), unemployed).
status(person(_,_,_,unemployed), unemployed). % <-- note the second argument!
status
的定义指出,如果第一个参数调用person
为unemployed
,第二个参数为文字unemployed
,然后status
将返回true。
您可以为status
设置多个定义这一事实基本上意味着&#34;有多种方法可以使其返回true&#34;。但是现在让我们假装我们只有这个。
在查询时,任何被变量替换的术语都要求prolog尝试将它们与已知的内容统一起来,并查看是否存在任何可以使status
成立的统一。
例如,以下查询将执行如下操作:
?- X = person(john,_,_,_), status(X, Y).
X = person(john, _G2392, _G2393, unemployed),
Y = unemployed.
(即查找是否有person
名为john
的{{1}},如果是,Y
是否会使status
谓词为真?答案是肯定的,因为,鉴于我们的人失业,然后设置Y =失业,满足我们对上述status
的定义。)