Prolog,打印具有相同名称的员工

时间:2018-12-19 16:05:31

标签: 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).

但是它会打印该部门中的所有员工。

我如何仅打印同名员工?

1 个答案:

答案 0 :(得分:2)

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/1nl/0谓词只是将结果写入屏幕。

示例:

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

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

请参阅:Prolog check if first element in lists are not equal and second item in list is equal

并查看我的answernormalize/4setof/3的用法

我留给您练习。