从事实返回名称列表

优珀

我正在学习序言,并尝试从所做的声明中返回名称列表。

例子:

person(sam). 
person(tom). 
person(holly).

我想返回亲自宣布的任何人的名字。我尝试这样做:

people([]).
people([X | XS]) :-
    person(X),
    people(XS).

它的工作原理是,添加sam到列表中,然后sam无限添加,而不是切换到tom,然后holly再结束。有人能指出我正确的方向吗?

威廉·范昂塞姆

定制实施

例如,您可以使用member/2和累加器来解决此问题

people(L) :-
    people([],L).
people(L,[X|R]) :-
    person(X),
    \+member(X,L),
    people([X|L],R).
people(L,[]) :-
    \+ (person(X),\+ member(X,L)).

或者,如果您知道如何使用cut!),则可以使用@CapelliC的版本

people(L) :-
    people([],L).
people(L,[X|R]) :-
    person(X),
    \+member(X,L),
    !,
    people([X|L],R).
people(L,L).

每次所以你找一个person/1 X这样的,这是不是成员L如果您再找不到这样的人,则选择最后一个子句。在这种情况下,空列表[]将向后传播,并且对于调用堆栈中的每个元素,将特定元素X添加到最前面。

使用findall/3内置

但是,遵循ISO标准的Prolog变体具有内置功能findall/3

findall(+Template, :Goal, -Bag)

您可以如下使用它:

  • Template是一个仿函数(这可能是一个变量),你希望获得,这里的数据X;
  • Goal是应满足的谓词(或谓词列表等)。Prolog将在内部调用Goal;
  • Bag 是输出:结果列表。

如果您这样使用:

people(L) :-
    findall(X,person(X),L).

它将生成所有person/1列表

?- findall(X,person(X),L).
L = [sam, tom, holly].

还有其他保证唯一性的高阶谓词,等等。

语义差异

请注意,findall/3和我们自己的people/1方法在语义上并不等效。确实,如果您的数据库包含一个人两次,那么在的包中它将是两次findall/3此外,我们自己people/1将以各种可能的顺序枚举列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CLIPS - 从事实列表中获取特定模板的事实

来自分类Dev

从事实中检索特定参数

来自分类Dev

Matlab / Simulink:从事实表创建数组

来自分类Dev

您可以从事实表中提取维表吗?

来自分类Dev

从事件列表创建“直方图”

来自分类Dev

XBRL商业事实的名称数量

来自分类Dev

如何访问列表中的事实

来自分类Dev

返回带有多个国家名称的列表

来自分类Dev

返回包含多个列名称的索引的列表

来自分类Dev

通过生成的名称设置可靠的事实

来自分类Dev

列表Prolog中每个元素的事实

来自分类Dev

如何从Prolog中的事实创建列表?

来自分类Dev

设置事实后创建新列表

来自分类Dev

前言。如何访问事实中的列表成员?

来自分类Dev

Prolog:使用事实替换列表项

来自分类Dev

设置事实后创建新列表

来自分类Dev

如何从Prolog中的事实创建列表?

来自分类Dev

列表Prolog中每个元素的事实

来自分类Dev

prolog : 在事实中使用列表的元素

来自分类Dev

Python winappdbg 从事件对象中获取进程名称

来自分类Dev

从ssas多维数据集,如何按salespoint和月份从事实销售中获得最高销售额

来自分类Dev

在Python列表中查找并返回名称和重复值的计数

来自分类Dev

通过复合类名称搜索时,BeautifulSoup返回空列表

来自分类Dev

当某些字母匹配时,从列表中返回名称

来自分类Dev

如何检索具有特定名称的规则断言的事实?

来自分类Dev

控制器返回列表对象的类型名称,而不是列表中的内容

来自分类Dev

如何在AppleScript中返回列表项的名称并使列表与另一个匹配?

来自分类Dev

在Excel中,如何检查项目是否属于3个列表之一并返回列表名称

来自分类Dev

使用Java代码访问Drools返回的事实对象

Related 相关文章

热门标签

归档