如何在Prolog中实现指定参数数量的answer谓词?及语法疑问
Prolog谜题谓词实现与元数说明
核心概念明确
谓词名后的斜杠加数字确实代表谓词的参数数量(元数),这是Prolog的标准表示法,用来区分同名但参数个数不同的谓词(比如clues/2是带2个参数的谓词,answer1/1是带1个参数的)。
三个谓词的实现方案
假设你已有的clues(Left, Right)中,Left和Right都是包含3个居民项的列表(对应三层楼),每个居民项是类似person(Name, Age, Hobby)的复合结构(可根据你的实际结构调整)。
1. answer1/1:单个参数返回所有居民信息
把左右两侧的信息打包成复合结构或列表,用单个参数承载所有数据:
% 用复合结构打包左右两侧 answer1(left_right(Left, Right)) :- clues(Left, Right). % 或用列表(更直观) answer1([Left, Right]) :- clues(Left, Right).
查询示例:answer1(AllInfo).,AllInfo会返回包含左右两侧居民的结构/列表。
2. answer2/2:返回匹配特定属性的居民
第一个参数传入目标属性(比如wladyslaw),第二个参数返回对应的居民信息:
answer2(TargetAttr, Resident) :- clues(Left, Right), append(Left, Right, AllResidents), % 合并左右所有居民 member(Resident, AllResidents), % 遍历查找 Resident =.. [person, TargetAttr | _]. % 匹配第一个属性为TargetAttr的居民
如果你的居民结构是元组(比如(Name, Age)),把最后一行改成Resident = (TargetAttr, _)即可。
查询示例:answer2(wladyslaw, WladInfo).,会返回名为wladyslaw的居民信息。
3. answer3/3:返回左侧三层的居民信息
把左侧的3个居民拆分为3个独立参数返回(对应三层楼):
answer3(LeftFloor1, LeftFloor2, LeftFloor3) :- clues([LeftFloor1, LeftFloor2, LeftFloor3], _).
查询示例:answer3(FirstFloor, SecondFloor, ThirdFloor).,会分别返回左侧一、二、三楼的居民信息。
内容的提问来源于stack exchange,提问作者Michał Mazur
相关产品推荐
相关产品推荐

