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
в моем ответе
, который я оставляю в качестве упражнения для вас.