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)]。
这个例子非常好用,我从这篇文章中学到了很多,非常感谢你的帮助。