PROLOG知识库

时间:2016-11-09 23:02:06

标签: prolog

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).

1 个答案:

答案 0 :(得分: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设置多个定义这一事实基本上意味着&#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的定义。)