Обязательно ли делать это с одним правилом?Вы можете использовать одно правило для сравнения сотрудников, которые были приняты на работу в разные годы, и второе правило для сравнения сотрудников, которые были приняты на работу в том же году.Чтобы расширить это, скажем, у вас есть сотрудники, перечисленные таким образом:
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)
в
employee(eID,firstname,lastname,yyyymm)