问题标签 [iso-prolog]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
245 浏览

prolog - N未绑定时的“nth0/3”行为

如果我在 SWI Prolog 中键入“nth0”查询,结果是:

但是,SWI 手册说:

所以,如果我对这段文字的理解是正确的(?),似乎应该触发错误而不是之前的结果。

另外,我想知道考虑到 ISO 标准,哪一种行为是正确的。

(我知道堆栈溢出不允许引用问题,所以,我不会要求提供标准链接,但如果我问:ISO 标准是否公开可用?如果没有,我希望不要违反规则等效的 RFC?)。

0 投票
5 回答
729 浏览

algorithm - 与 STO 检测统一

在 ISO Prolog 中,统一仅针对 NSTO(不受发生检查)的情况定义。背后的想法是涵盖那些主要用于程序中并且实际上被所有 Prolog 系统支持的统一案例。更具体地说,ISO/IEC 13211-1:1995 内容如下:

7.3.3 受发生检查(STO)和不受
发生检查(NSTO)

一组方程(或两个项)是“服从发生
检查”(STO),如果存在通过
Herbrand 算法的步骤进行的方法,使得 7.3.2 g
发生。

一组方程(或两项)是“不受
发生检查”(NSTO)的,如果没有办法继续执行
Herbrand 算法的步骤,从而
发生 7.3.2 g。

...

此步骤 7.3.2 g 内容如下:

g) 如果存在X = t形式的方程,其中
X一个变量,t是一个包含该变量的非变量项
,则以失败退出(不可
统一
正发生检查)。

完整的算法称为 Herbrand 算法,也就是通常所说的Martelli-Montanari 统一算法——它本质上是通过以非确定性方式重写方程组来进行的。

请注意,新方程的引入如下:

d) 如果存在f(a 1 ,a 2 , ...a N ) =
f(b 1 ,b 2 , ...b N )
形式的方程,则将其替换为方程组
a i =我_

这意味着具有相同函子但不同元数的两个复合术语永远不会对 STO 产生影响。

这种不确定性是 STO 测试难以实施的原因。毕竟,仅测试是否需要发生检查是不够的,但要证明对于执行算法的所有可能方式,这种情况永远不会发生。

这里有一个案例来说明情况:

统一可以从 开始A = 1,也可以从任何其他对开始,并以任何顺序继续。为确保 NSTO 属性,必须确保没有可能产生 STO 情况的路径。考虑一个对于当前实现来说没有问题的案例,但这仍然是 STO:

Prolog 系统首先将这个方程重写为:

现在,他们选择

  • 1 = 2这使得算法失败退出,或者

  • A = s(A)其中步骤 g 适用并且检测到 STO-ness。

我的问题是双重的。首先,它是关于 ISO Prolog 中的一个实现unify_sto(X,Y)(仅使用第 1 部分定义的内置函数),它适用于以下内容:

  • 如果统一是 STO,则unify_sto(X,Y)产生错误,否则

  • 如果unify_sto(X,Y)成功则也X = Y成功

  • 如果unify_sto(X,Y)失败则也X = Y失败

我的第二个问题是关于在这种情况下发出的具体错误。请参阅 ISO 的错误类别


这是一个简单的开始步骤:所有成功案例都包含在unify_with_occurs_check(X,Y). 剩下要做的是区分 NSTO 故障和 STO 错误情况。那是事情开始变得困难......

0 投票
1 回答
535 浏览

module - 为什么 prolog 的 ISO 模块标准失败了?

这里的介绍中,它指出 Prolog 的 ISO 模块标准是失败的。谁能详细说明这一点?

0 投票
1 回答
173 浏览

prolog - gprolog 中的 ANSI 转义字符

尝试在序言中打印粗体和带下划线的文本但无法编写它们

产生这个(预期的)错误:

正确的做法是什么gprolog?也许与format

0 投票
2 回答
356 浏览

syntax - 为什么作为高优先级运算符的原子不需要圆括号?

在较旧的教科书1中,经常会遇到如下运算符声明:

这些圆括号曾经是必要的。但今天,它们不再需要:

为什么不再需要它们?标准如何应对这种情况?


1 p.97 6. MU-Prolog 3.2db 参考手册的标准操作员声明,出现在 Lee Naish 的 Negation and Control in Prolog 中,LNCS 238,Springer-Verlag 1985。

0 投票
1 回答
147 浏览

prolog - 列出给定库模块中的谓词

有没有办法列出在给定库模块中为 SICStus Prolog 定义的所有谓词?

例如,如果我加载列表模块:

我可以从提示符运行另一个谓词来告诉我刚刚导入了哪些谓词?

0 投票
3 回答
941 浏览

sorting - sort/2、keysort/2 与 samsort/3、predsort/3

ISO-Prolog 提供sort/2keysort/2依赖于术语顺序 (7.2),通常称为“标准术语顺序”。El以不同顺序对列表进行排序的常用方法是将该列表的每个元素以某种方式映射到一个对XKey-El列表,然后对该列表进行排序,最后将键投影掉。作为一个例子,考虑如何keysort/2sort/2参见实现的注释)来表达。

在许多情况下,这种方法比使用依赖于用户定义的顺序(如 SWI'spredsort(C_3, List, SortedList) 或 SICStus' )的通用实现特定排序谓词快得多samsort(O_2, List, SortedList)

我的问题归结为:

是否存在使用predsort/3resp 进行排序的情况。samsort/3不能被一些映射、sort/2-ing和投影代替吗?1

为了清楚起见,最好坚持有限的基础术语。因为,无限的基础词项不具有一个总的词典顺序,因为它需要作为有限情况的扩展;此外,在 ISO/IEC 13211-1:1995 的 7.2.1 中,变量与两个不同变量的实现相关的情况的比较将如何结果尚不清楚:

7.2.1 变量

如果XY是不相同的变量,则
X term_precedes Y应依赖于实现
,除非在创建排序列表(
7.1.6.5、8.10.3.1 j)期间,排序应保持不变。

因此尚不清楚是否predsort/3仍符合创建排序列表的条件。很明显,在和期间 排序保持不变。sort/2keysort/2


1 感谢@WillNess,这个投影至少还应该包括reverse/2——或任何线性变换。这也意味着可以实现具有重复和唯一的结果(类似于实现的方式keysort/2)。

0 投票
1 回答
99 浏览

prolog - 否定削减的行为

123正如预期的那样,由于回溯,以下代码会输出:

这个带有 cut outputs 的1,也如预期的那样:

但是这个输出123令人惊讶:

not(!)评估为假,因此在一种方式上,它回溯是有道理的,但同时它应该已经切割,因此没有其他可能性可供探索。

相同的行为发生在\+而不是not/1

为什么在否定时削减没有任何副作用?例如write/1,在 anot中与不在其中时具有相同的副作用。

0 投票
1 回答
993 浏览

list - Prolog 错误参数

我想知道如何在 Prolog 中添加错误检查。例如,我有一个程序可以查找列表的长度:

当它发生时,我如何打印出像“第一个参数必须是一个列表”这样的错误?

0 投票
1 回答
1168 浏览

prolog - 如何在 Prolog 中编写键值对?

想象一下,我有以下谓词,它指出 IDloc1指定了一个位置。

我想为第二个文本 ( Location 1) 提供翻译,即键值对,例如en='Location 1', de='Ort 1', ru='Местоположение 1'.

在 Prolog 中编码此类数据的正确方法是什么,尤其是 TuProlog(以及理想的标准化 Prolog)?

下面的符号可以在 SWI Prolog 之外工作吗?