Предикат Пролог, который сравнивает значения в фактах - PullRequest
0 голосов
/ 18 декабря 2018

Я впервые использую 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.Я не могу понять причину.

Как я могу заставить этот предикат работать?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Обязательно ли делать это с одним правилом?Вы можете использовать одно правило для сравнения сотрудников, которые были приняты на работу в разные годы, и второе правило для сравнения сотрудников, которые были приняты на работу в том же году.Чтобы расширить это, скажем, у вас есть сотрудники, перечисленные таким образом:

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)
0 голосов
/ 18 декабря 2018

В Прологе переменные начинаются с буквы нижнего или верхнего регистра.Например, firstname является атомом , то есть константой, но FirstName является переменной .Но в вашем конкретном вопросе вас не интересуют имена сотрудников.Таким образом, вы можете заменить эти аргументы анонимной переменной:

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

Теперь вы можете дополнить код, написав необходимые сравнения, используя Xmonth, Xyear, Ymonth и Yyear переменные?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...