PROLOG-如何使用从键盘读取的值进行搜索

PROLOG-如何使用从键盘读取的值进行搜索,prolog,Prolog,伙计们,我想用下面的搜索序言来做以下事情:返回所有有同性的人,但是应该从键盘上读取他们的性别。我可以不用读键盘,代码如下: person('1', 'Joane', 'Women'). person('2', 'John', 'Man'). person('3', 'Peter', 'Man'). listaBySex(List):- findall(Name, pessoa(_, Name , 'Man'), List). person('1', 'Joane', 'Wom

伙计们,我想用下面的搜索序言来做以下事情:返回所有有同性的人,但是应该从键盘上读取他们的性别。我可以不用读键盘,代码如下:

person('1', 'Joane', 'Women').  
person('2', 'John', 'Man').  
person('3', 'Peter', 'Man').  
listaBySex(List):-  
findall(Name, pessoa(_, Name , 'Man'), List). 
person('1', 'Joane', 'Women').  
person('2', 'John', 'Man').  
person('3', 'Peter', 'Man'). 
listaBySex(List):- 
write('Sex: '), read(Sex),
findall(Name, pessoa(_, Name , Sex), List). 
现在我的困难是通过从键盘读取的值来进行这项研究,我可以从键盘读取值。大多数人不知道如何将此值与read findall关联,以返回代码如下所示的值:

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

除了您的数据库有
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).

这就是它返回整个数据库的原因。您可能需要更仔细地处理输入,以使其满足您的需要。毕竟,你可能也不想在行尾输入句号。

OT,但应该是
person('1','Joane','Women')。
为了澄清George的信息,你应该接受Daniel的答案(点击复选框…)