List 序言:从原子列表返回事实列表

List 序言:从原子列表返回事实列表,list,prolog,List,Prolog,我高度怀疑这是可能的,但我想知道是否有一种方法可以将一系列原子转化为一系列事实。假设两个事实之间不会有原子的重复 更准确地说,假设我有以下事实清单: person(Mike, male, 33). person(Frank, male, 24). person(Julie, female, 25). 我想打电话 listFacts( [Mike, Frank], L). 它应该返回 L = [person(Mike, male, 33), person(Frank, male, 24)].

我高度怀疑这是可能的,但我想知道是否有一种方法可以将一系列原子转化为一系列事实。假设两个事实之间不会有原子的重复

更准确地说,假设我有以下事实清单:

person(Mike, male, 33).
person(Frank, male, 24).
person(Julie, female, 25).
我想打电话

listFacts( [Mike, Frank], L).
它应该返回

L = [person(Mike, male, 33), person(Frank, male, 24)].

您当前正在使用变量(以大写字母开头的标记)。您必须切换到常量(在本例中为原子):
Mike
->
Mike

之后,使用
setof/3
,就很容易了:

人(迈克,男,33岁)。
此人(弗兰克,男,24岁)。
个人(朱莉,女,25岁)。
列表事实(名称、列表):-
集合(人员(姓名,S,A),(成员(姓名),人员(姓名,S,A)),列表)。
这意味着:找到
Name
的答案,这些答案取自
Names
,其中有一个事实
person(Name,S,a)
存在,并将相应的术语
person(Name,S,a)
放入一个名为
list
的集合(实际上是一个列表)

因此:

?-listFacts([mike,frank],F)。
F=[个人(弗兰克,男性,24岁),个人(迈克,男性,33岁)]。
存在性限定的变更也适用于:

listFacts(名称、列表):-
集合(个人(姓名,S,A),姓名^(成员(姓名,姓名),个人(姓名,S,A)),列表)。
正确地说,它不应与以下内容相同:

listFacts(名称、列表):-
集合(人(_Name,S,A),子目标(Name,S,A),列表)。
子目标(名称、S、A):-
成员(姓名),
人(姓名,S,A)。
这并没有给我们提供关于
名称的任何信息:

?-listFacts([mike,frank],F)。
F=[个人(_6478,男性,24),个人(_6492,男性,33)]。

这个例子非常好用,我从这篇文章中学到了很多,非常感谢你的帮助。