无限的列表是理智的吗?

2024-01-11

在Prolog中,是统一X = [1|X]一种获得无限列表的明智方法? SWI-Prolog 没有任何问题,但 GNU Prolog 只是挂起。

我知道在大多数情况下我可以用以下内容替换列表

one(1).
one(X) :- one(X).

但我的问题是明确是否可以使用这个表达X = [1|X], member(Y, X), Y = 1在“理智的”Prolog 实现中。


在Prolog中,是统一X = [1|X]一种获得无限列表的明智方法?

这取决于您是否认为生成无限列表是明智的。在 ISO-Prolog 中,统一如下X = [1|X]受到发生检查 (STO) 的影响,因此未定义。也就是说,符合标准的程序一定不能执行这样的目标。为了避免这种情况发生,有unify_with_occurs_check/2, subsumes_term/2。为了防止接口接收无限项,有acyclic_term/1.

所有当前的实现都终止于X = [1|X]。 GNU Prolog 也终止:

| ?- X = [1|X], acyclic_term(X).

no

但对于更复杂的情况,需要合理的树统一。将此与 Haskell 进行比较,其中repeat 1 == repeat 1 causes ghci冻结。

至于在常规 Prolog 程序中使用有理树,一开始很有趣,但扩展得不太好。例如,在 20 世纪 80 年代初的一段时间内,人们相信语法将使用有理树来实现。唉,人们对 DCG 已经足够满意了。 这没有离开研究的原因之一是,Prolog 程序员假设存在的许多概念对于有理树来说并不存在。以词典术语排序为例,它对于理性树没有扩展。也就是说,存在无法使用标准术语顺序进行比较的理性树。 (实际上,这意味着您会得到准随机结果。)这意味着您无法生成包含此类术语的排序列表。这又意味着许多内置函数喜欢bagof/3不再可靠地使用无限项。

对于您的示例查询,请考虑以下定义:

memberd(X, [X|_Xs]).
memberd(E, [X|Xs]) :-
   dif(E,X),
   memberd(E, Xs).

?- X = 1, Xs=[1|Xs], memberd(X,Xs).
   X = 1, Xs = [1|Xs]
;  false.

所以有时有一些简单的方法可以避免非终止。但大多数情况下都没有。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无限的列表是理智的吗? 的相关文章

  • 在列表列表中查找形状

    节目说明 该计划的目的 我的程序旨在计算 20X15 大小的平面中形状的位置 我有一个形状列表 其中包含形状类型 其 ID 半径或高度以及其在平面上的预期 X Y 位置 我有一个不同的二元运算列表 仅包含形状类型 其 id 及其与另一个形状
  • 如何将 HashMap> 存储在列表中?

    我的哈希图将字符串存储为键 将数组列表存储为值 现在 我需要将其嵌入到列表中 也就是说 它将采用以下形式 List
  • 从列表中删除元素的最佳方法

    我想知道从列表中删除元素的最佳方法 有效方法是什么 有功能很少 https docs python org 3 tutorial datastructures html more on lists由Python提供 some list re
  • Python 中的数字列表求和[重复]

    这个问题在这里已经有答案了 给定一个数字列表 例如 1 2 3 4 5 我如何计算它们的总和 1 2 3 4 5 我如何计算它们的成对平均值 1 2 2 2 3 2 3 4 2 4 5 2 问题一 要对数字列表求和 请使用sum https
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • 使用 List.Sort(Comparison Comparison 在 C# 中对列表进行排序

    我创建了一个类 如下所示 public class StringMatch public int line num public int num of words 我创建了一个列表 List
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 从字典列表中删除具有重复值的字典

    我有一个字典列表如下 ppm error 5 441115144810845e 07 key Y7 obs ion 1054 5045550349998 ppm error 2 3119997582222951e 07 key Y9 obs
  • Python - ValueError:以 10 为基数的 int() 的文字无效:''

    求助 当我尝试从字符串中提取整数时 我不断收到 ValueError invalidliteral for int with base 10 from string import capwords import sys os import
  • 如何将 list 对象附加到另一个对象

    在 C 中 我有两个list
  • 列表清除是否删除先前包含的对象

    想象我有 List
  • 列表:Count 与 Count() [重复]

    这个问题在这里已经有答案了 给定一个列表 首选哪种方法来确定内部元素的数量 var myList new List
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • List.Except 不起作用

    我尝试减去 2 个列表 如下代码所示 assignUsers已获得 3 条记录assignedUsers有 2 行 后Except方法我仍然得到 3 行 尽管我应该得到 1 条记录 因为 2 行assignedUsers类似于assignU
  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • 如何访问对列表中对的每个元素?

    我有一个名为 对 的列表 pairs a 1 b 2 c 3 我可以通过以下方式访问元素 for x in pairs print x 其输出如下 a 1 b 2 c 3 但我想访问每对中的每个元素 就像在 c 中一样 如果我们使用pair
  • R 数据框到嵌套列表

    我想将这种格式的数据帧 tbl 转换为以下嵌套列表 tbllst library tidyr tbl lt tribble Col1 Col2 Col3 Var1 Var1 1 Var1 1 1 Var1 Var1 1 Var1 1 2 V
  • 随机打乱列表[重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中随机化 List https stackoverflow com questions 273313 randomize a listt in c sharp 随机播放 随机重新排列 List
  • Python如何拆分列表列表?

    我有一个清单清单 myList 1 2 3 4 5 6 7 8 9 10 我想将其分成三个单独的列表 每个列表都有自己的名称 a 1 2 3 b 4 5 6 c 7 8 9 10 我该怎么做呢 您可以直接解压它 a b c myList
  • 如何从字典列表中查找键的值?

    如何从字典列表中获取给定键的值 mylist powerpoint color blue client name Sport Parents Regrouped sort order ascending chart layout 1 cha

随机推荐