Пролог, печать сотрудников с такими же именами - PullRequest
0 голосов
/ 19 декабря 2018

Я впервые использую Пролог.

У меня есть сотрудники:

 employee(eID,firstname,lastname,month,year).

У меня есть единицы измерения:

 unit(uID,type,eId).

Я хочу создать предикат

double_name(X).

, который печатает фамилии сотрудников с одинаковыми именами в блоке X.

Я делаю что-то вроде этого:

double_name(X) :- 
  unit(X,_,_eID),
  employee(_eID,_firstname,_,_,_),
  _name = _firstname,
  employee(_,_name,_lastname,_,_),
  write(_lastname).

Но этопечатает всех сотрудников в блоке.

Как можно распечатать только сотрудников с одинаковыми именами?

1 Ответ

0 голосов
/ 19 декабря 2018
unit(unit_01,type,1).
unit(unit_01,type,2).
unit(unit_01,type,3).

employee(1,mary,smith,6,1992).
employee(2,fred,jones,1,1990).
employee(3,mary,cobbler,2,1995).

double_name(Unit) :-
  unit(Unit,_,Eid_1),
  employee(Eid_1,Firstname,Lastname_1,_,_),
  unit(Unit,_,Eid_2),
  Eid_1 \= Eid_2,
  employee(Eid_2,Firstname,Lastname_2,_,_),
  write(Firstname),write(","),write(Lastname_1),nl,
  write(Firstname),write(","),write(Lastname_2).

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

В double_name/2 предикаты похожи на

unit(Unit,_,Eid_1) 
employee(Eid_1,Firstname,Lastname_1,_,_)

используются для загрузки значений из фактов в переменные при сопоставлении с образцом (через объединение), в котором связанные переменные совпадают с фактом.

Чтобы гарантировать, что человек не сравнивается с собой.

Eid_1 \= Eid_2

и чтобы убедиться, что два человека имеют одинаковые имена, используется одна и та же переменная: Firstname.

Предикаты write/1 и nl/0 просто выводят результат на экран.

Пример:

?- double_name(unit_01).
mary,smith
mary,cobbler
true ;
mary,cobbler
mary,smith
true ;
false.

Обратите внимание, что правильный ответ дублирован.Это может быть решено.

См .: Пролог проверяет, не совпадают ли первый элемент в списках и равен ли второй элемент в списке

, и посмотрите на использование normalize/4 и setof/3 в моем ответе

, который я оставляю в качестве упражнения для вас.

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