Предикат Prolog, который сравнивает значения в фактах

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

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

Это не способ управлять компанией, и это незаконно в Европе. Вы не должны проводить дискриминацию по возрасту, за исключением случаев, когда есть веская причина (например, закон ограничивает рабочее время для людей младше порочного возраста).

ctrl-alt-delor 18.12.2018 12:21

лол, кстати, это дата, когда сотрудник нанял!

Thelouras 18.12.2018 12:33

Если вы имеете в виду дату приема на работу сотрудника был, то это менее хитроумно. Однако я до сих пор не понимаю, какое значение имеет такое сравнение людей. Один человек может проработать в компании несколько недель, но на конкретной работе он будет намного лучше, чем тот, кто проработал там 10 лет.

ctrl-alt-delor 18.12.2018 12:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
147
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В Прологе переменные начинаются либо с подчеркивания, либо с заглавной буквы. Например. 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)

Другие вопросы по теме