首页 > 解决方案 > Prolog,打印同名员工

问题描述

这是我第一次使用 Prolog。

我有员工:

 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).

但它会打印单位中的所有员工。

我怎样才能只打印同名的员工?

标签: prolog

解决方案


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).

Prolog 中的变量通常以大写字母开头,但允许以和下划线开头,但不典型。

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.

请注意,正确答案是重复的。这可以解决。

请参阅:Prolog 检查列表中的第一个元素是否不相等且列表中的第二个元素是否相等

看看我的回答normalize/4中和的用法setof/3

我把它留给你作为练习。


推荐阅读