这是我第一次使用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),
...
您现在可以通过使用Xmonth
,Xyear
,Ymonth
和Yyear
变量编写必要的比较来完成代码?