Prolog谓词比较事实中的值



这是我第一次使用prolog

我有员工

employee(eID,firstname,lastname,month,year) 

示例:

employee(1,liz,white,4,2000).
employee(2,ted,johnson,5,1998).

我想制作一个谓词senior(X,Y),如果公司在公司年龄较大的情况下,将返回true。

我有这个:

senior(X,Y) : -
  employee(X,firstname,lastname,month,year),
  employee(Y,firstname,lastname,month,year),
  X.year < Y.year.

但这总是返回false。我不明白原因。

如何使此谓词起作用?

是否必须使用一个规则执行此操作?您可以使用一条规则来比较在不同年份被雇用的员工,这是比较同年雇用的员工的第二条规则。为了扩展这一点,假设您以这种方式列出了员工:

employee(eid,year,month,day)

当然还有员工清单。您可以使用以下三个规则:

% For employees that were hired in different years.
senior(Eid1,Eid2) :-
    employee(Eid1,X,_,_),
    employee(Eid2,Y,_,_),
    X<Y.
% For employees that were hired in the same year, different month.
senior(Eid1,Eid2) :-
    employee(Eid1,Year,X,_);
    employee(Eid2,Year,Y,_);    % Notice how one common variable "Year" is used
    X<Y.
% For employees that were hired in the same year, same month, different day,
% the rule is "expanded" from the previous one.
senior(Eid1,Eid2) :-
    employee(Eid1,Year,Month,X);
    employee(Eid2,Year,Month,Y);
    X<Y.

确保您不要忘记并用下划线替换"年"和/或"月",因为那时有人在 2010-01-01(ISO 8601) 2005-12-12

雇用的人

然后,也许您应该在 ISO 8601:2004 中对所有日期进行分类。无论您的员工列表多大,您都可以编写一个小脚本以转换

employee(eID,firstname,lastname,month,year)

to

employee(eID,firstname,lastname,yyyymm)

在prolog中,变量以下划线或上案字母开头。例如。 firstname arom ,即一个常数,但是 FirstName actiable 。但是,在您的特定问题中,您不在乎员工的名字。因此,您可以通过匿名变量替换这些参数:

senior(X,Y) : -
  employee(X, _, _, Xmonth, Xyear),
  employee(Y, _, _, Ymonth, Yyear),
  ...

您现在可以通过使用XmonthXyearYmonthYyear变量编写必要的比较来完成代码?

最新更新