这是我第一次使用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).
但是它会打印该部门中的所有员工。
我如何仅打印同名员工?
答案 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/1
和nl/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
并查看我的answer中normalize/4
和setof/3
的用法
我留给您练习。