prolog - 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).
但它会打印单位中的所有员工。
我怎样才能只打印同名的员工?
解决方案
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
我把它留给你作为练习。
推荐阅读
- google-chrome - TravisCI - Google Chrome 稳定版无法通过身份验证
- sql-server - 唯一索引/约束以及 NOT NULL 关键字在技术上与主键相同吗?
- typescript - react-hook-form 和 typescript - 类型DetailedHTMLProps上不存在属性'inputRef'
- ios - 如何使用带有 WatchOS SwiftUI 建议的 TextField
- web-services - 为什么 Web 服务测试不起作用?浏览器不断要求登录
- python - nosetests - 如何检测子目录中的测试?
- ios - 我的 iOS 应用程序在 AppStore 中,但它没有出现在上面
- python - Python 打印到 PDF
- apache-spark - Databricks 环境中的 SparkSessionExtensions injectFunction
- php - 通过registration_ids参数向多个android设备发送fcm通知消息