Я впервые использую Prolog
У меня есть сотрудники
employee(eID,firstname,lastname,month,year)
пример :
employee(1,liz,white,4,2000).
employee(2,ted,johnson,5,1998).
Я хочу создать предикат senior(X,Y)
, который вернет истину, если первый сотрудник в компании старше.
У меня есть это:
senior(X,Y) : -
employee(X,firstname,lastname,month,year),
employee(Y,firstname,lastname,month,year),
X.year < Y.year.
но это всегда возвращает false. Я не могу понять причину.
Как я могу заставить этот предикат работать?
лол, кстати, это дата, когда сотрудник нанял!
Если вы имеете в виду дату приема на работу сотрудника был, то это менее хитроумно. Однако я до сих пор не понимаю, какое значение имеет такое сравнение людей. Один человек может проработать в компании несколько недель, но на конкретной работе он будет намного лучше, чем тот, кто проработал там 10 лет.
В Прологе переменные начинаются либо с подчеркивания, либо с заглавной буквы. Например. firstname
- это атом, то есть константа, но FirstName
- это Переменная. Но в вашем конкретном вопросе вас не интересуют имена сотрудников. Таким образом, вы можете заменить эти аргументы переменной анонимный:
senior(X,Y) : -
employee(X, _, _, Xmonth, Xyear),
employee(Y, _, _, Ymonth, Yyear),
...
Можете ли вы завершить код, написав необходимые сравнения с использованием переменных Xmonth
, Xyear
, Ymonth
и Yyear
?
Обязательно ли делать это с одним правилом? Вы можете использовать одно правило для сравнения сотрудников, нанятых в разные годы, а второе правило - для сравнения сотрудников, нанятых в один и тот же год. Чтобы расширить это, предположим, что у вас есть сотрудники, перечисленные таким образом:
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.
Убедитесь, что вы не забыли, и замените «Год» и / или «Месяц» символами подчеркивания, потому что тогда кто-то, нанятый на 01.01.2010 (ISO 8601), будет показан как старший по отношению к кому-то, нанятому на 2005-12-12.
Опять же, возможно, вам следует каталогизировать все даты в ISO 8601: 2004. Независимо от того, насколько велик список ваших сотрудников, вы можете написать небольшой скрипт для преобразования
employee(eID,firstname,lastname,month,year)
к
employee(eID,firstname,lastname,yyyymm)
Это не способ управлять компанией, и это незаконно в Европе. Вы не должны проводить дискриминацию по возрасту, за исключением случаев, когда есть веская причина (например, закон ограничивает рабочее время для людей младше порочного возраста).