0

伙计们,我想使用以下搜索序言执行以下操作:返回所有具有相同性别的人,但应从键盘读取该性别。我可以不读键盘,代码如下所示:

person('1', 'Joane', 'Women').  
person('2', 'John', 'Man').  
person('3', 'Peter', 'Man').  
listaBySex(List):-  
findall(Name, pessoa(_, Name , 'Man'), List). 

现在我的困难是用从键盘读取的值进行这项研究,我可以从键盘读取值最不知道如何将此值与读取 findall 以返回值,此时代码如下所示:

person('1', 'Joane', 'Women').  
person('2', 'John', 'Man').  
person('3', 'Peter', 'Man'). 
listaBySex(List):- 
write('Sex: '), read(Sex),
findall(Name, pessoa(_, Name , Sex), List). 
4

1 回答 1

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).

这就是它返回整个数据库的原因。您可能需要更仔细地处理输入以使其按照您的意愿行事。毕竟,您可能也不希望在行尾输入句点。

于 2013-07-10T02:22:15.443 回答