我们,我想使用以下搜索序言来执行以下操作:返回所有具有相同性别的人,但应该从键盘上读取性别。我可以在不阅读键盘的情况下完成,代码如下所示:
person('1', 'Joane', 'Women').
person('2', 'John', 'Man').
person('3', 'Peter', 'Man').
listaBySex(List):-
findall(Name, pessoa(_, Name , 'Man'), List).
现在我的困难是用键盘读取的值进行这项研究,我可以从键盘读取值,大多数不知道如何将此值与readall相关联,以便在代码看起来返回值像这样:
person('1', 'Joane', 'Women').
person('2', 'John', 'Man').
person('3', 'Peter', 'Man').
listaBySex(List):-
write('Sex: '), read(Sex),
findall(Name, pessoa(_, Name , Sex), List).
答案 0 :(得分:2)
除了您的数据库有person/3
并且您正在调用pessoa/3
之外,您的代码按原样运行,您只需在输入时引用性别:
?- listaBySex(List).
Sex: 'Man'.
List = ['John', 'Peter'].
?- listaBySex(List).
Sex: 'Women'.
List = ['Joane'].
问题是read/1
读取了Prolog术语,因此当您输入Man
没有引号时,Prolog会将其作为变量读取,因此您的代码实际上与此相同:
listaBySex(List) :-
read(_), findall(Name, pessoa(_, Name, _), List).
这就是它返回整个数据库的原因。您可能需要更仔细地处理输入以使其按照您的需要进行操作。毕竟,你可能不想在行尾输入句号。