问题标签 [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.
casting - SICStus Prolog 原子到字符串
我需要将 Prolog 原子转换为整数。例如:
我已经看到了一些关于此的 SO 答案,但它们依赖于 SWI-Prolog,我被迫使用 SICStus Prolog。转换为字符串也可以完成这项工作,因为我知道number_codes/2
谓词。
谢谢你的帮助。
prolog - 在prolog中定义一个运算符
我需要定义一个以下列方式关联的新运算符
括号只是用来理解新操作的关联性
所以。
这将是 A 和 B 的值。
提前致谢。
iso-prolog - 标准中使用了“类型”的哪些含义?
在 Prolog 的 ISO 标准的第一部分 ISO/IEC 13211-1:1995 中,“类型”的概念用于指代不同的事物。这常常导致混乱。例如,一个名为 IsoErrata ( archived version , source ) 的页面指出(注意此页面与 ISO 无关):
7.12.2 和 8.1.2.1
关于什么是“类型”存在混淆。似乎有3个不同的组:
- 那些在 8.1.2.1 中列出并且也在 7.12.2.b 中的 type_error 术语中作为 ValidTypes 出现的那些
- 那些在 8.1.2.1 中列出并在 7.12.2.c 中的 domain_error 术语中作为 ValidDomain 出现的那些
- 仅在 8.1.2.1 中列出的那些
此外,7.12.2.c 中还有 ValidDomains 没有在 8.1.2.1 中列出,可能是错误的(例如 io_mode)。
8.14.3.3.f
模板需要
atom_or_atom_list
第三个参数的类型,但奇怪的是这里所需的错误术语是type_error(list,Operator)
. 这导致(参见示例)
op(30,xfy,0) =====> error(type_error(list,0))
在哪里
type_error(atom,0)
或type_error(atom_or_atom_list,0)
会更合适(但请注意,atom_or_atom_list
它不在 7.12.2 中列出的 ValidTypes 中!)。因此,对于 ECLiPSe,我们type_error(list,Op)
只选择了 ifOp
是一个不正确的列表,并且type_error(atom,Op)
ifOp
是任何其他非原子。
那么“类型”在哪些含义中使用,以及如何处理上述混淆?
error-handling - Prolog - 我如何捕捉不正确的错误?
不知道这个问题的措辞是否正确,我很抱歉。基本上我想做的是在 Prolog 中创建某种错误处理。例如:
现在,如果用户要查询:
我如何通知用户他们犯了错误?并返回一条消息:
module - predicate_property/2 的第一个参数是什么元参数?
换句话说,应该是0
还是:
其他?Prolog 系统 SICStus、YAP 和 SWI 都将其表示为:
. 这合适吗?不应该是 a 0
which 表示可以被调用的术语call/1
吗?
要检查您的系统类型:
我应该补充一点,元参数——至少在这里使用的形式——不能保证我们期望从纯关系中得到相同的代数属性:
这是来自 ISO/IEC 13211-2 的相关部分:
7.2.2 谓词属性/2
7.2.2.1 说明
predicate_property(Prototype, Property)
如果与参数关联的过程具有谓词属性 ,则
在模块的调用上下文中为真。M
Prototype
Property
...
7.2.2.2 模板和模式
predicate_property(+prototype, ?predicate_property)
7.2.2.3 错误
a)
Prototype
是一个变量
——instantiation_error
。...
c)
Prototype
既不是变量也不是可调用项
—type_error(callable, Prototype)
....
7.2.2.4 示例
...
iso-prolog - 在 ISO Prolog 中不接不接投掷
我正在努力解决在 ISO Prolog 中没有合适的 catch/3 的 throw/1 的精确语义是什么。我正在阅读 ISO Prolog 规范,在我看来,执行将以无限递归结束。
(请注意,您必须有权访问 ISO Prolog 标准才能解释此问题)。
第 1 步。假设我们调用了 throw(unknown),堆栈上没有任何 catch/3。
第 2 步。它将在 7.8.10.1 c) 中结束,说这将是系统错误 (7.12.2 j)。
第 3 步。这是在其他地方用于其他地方的相同类型的表述,所以我认为它应该以相同的方式解释。因此 7.12.1 适用,当前目标 (throw/1) 将替换为 throw(error(system_error, Imp_def))。
第 4 步。执行此目标将在堆栈上找不到它的活动“catch”。因此,它应该尝试相同的步骤,继续第 2 步,依此类推 => 无限递归。
您可能会说将未捕获的“抛出”转换为 system_error 是“最终的”,并且不像其他错误那样需要进一步处理,为了避免我描述的问题,它可能必须如此,但我的问题是,这在标准中的什么地方涵盖?
为了完整起见,其他一些注释:
7.12.2 中的注释 4 还提到了在这些情况下可能出现系统错误。我认为那里使用的公式(“....没有主动目标 catch/3”)在另一个方面引入了一些混淆,因为它应该符合条件,即捕手必须与错误术语(B )。
将未捕获的 throw-s 转换为系统错误背后的想法是什么?看起来它的存在可能是为了让顶级 Prolog 处理器的生活“更轻松”,以便它只接收一种可预测的错误?对我来说,这带来的问题多于好处 - 错误的真正原因将因此消失 - 任何意见或评论?
形式语义学(附件 A)似乎也在以某种方式与此作斗争,尽管我还没有详细研究它。在 A.2.5 中,它提到“......但是在正式规范中,在根部有一个捕手......”,并将其与例如 findall/3 的执行相关联。所以正式规范与正文不同?
prolog - 是否有序言语言语法/规范?
是否有序言语言语法,或通常用作参考的接近它的东西?我正在使用 SWI-prolog,所以有一个适合这种风格的会很好,否则通用的 prolog 语言语法/规范也可以。
prolog - Prolog,在终端中得到正确答案,但在运行程序时得到错误答案
在终端中键入“prolog”会得到:
打字:
获取:
然后按回车得到:
打字:
得到:
当我写一个文件时;test.pl 由以下内容组成:
然后在终端中写入:
我得到:
这里的答案应该是否定的?我究竟做错了什么。另外,您将如何在 prolog 中执行此操作:
即,我想向 prolog 顶层发送查询,并得到答案
prolog - 为什么必须在 Prolog 中将事实组合在一起?
假设我列出了事实:
如果我按“字母”顺序声明规则,我会在控制台中收到以下警告:
但是,如果我执行以下操作:
我没有收到警告。这些警告只是warnings
错误还是实际错误?
sorting - 如何在 ISO Prolog 中定义(和命名)相应的安全术语比较谓词?
标准术语顺序(ISO/IEC 13211-1 7.2 术语顺序)定义在所有术语上——包括变量。虽然这有很好的用途——想想setof/3
. 8.4 词条比较特点:
8.4 术语比较
8.4.1 (@=<)/2, (==)/2, (\==)/2, (@<)/2, (@>)/2, (@>=)/2。
8.4.2 比较/3。
8.4.3 排序/2。
8.4.4 键排序/2。
举个例子,考虑:
这成功了,因为
7.2 期限顺序
排序term_precedes
(3.181) 定义 了 term是否在X
term 之前Y
。如果
X
和Y
是相同的术语,那么X
term_precedesY
和Y
term_precedesX
都是假的。如果
X
和Y
有不同的类型:X
term_precedesY
iff 的
类型按以下顺序在类型之前:X
先于先于先于 先于。Y
variable
floating point
integer
atom
compound
注意——测试术语顺序的内置谓词
在 8.4 中定义。
...
因此所有变量都小于a
。但是一旦X
实例化:
结果无效。
所以这就是问题所在。为了克服这个问题,可以使用约束,或者只坚持核心行为,从而产生一个instantiation_error
.
7.12.2 错误分类
错误按以下形式分类
Error_term
:
a) 当参数或其组件之一是变量并且需要
实例化参数或组件时,应存在实例化错误。它有
形式instantiation_error
。
通过这种方式,只要不发生实例化错误,我们就可以确定结果是明确定义的。
对于(\==)/2
,已经存在dif/2
使用约束或iso_dif/2
产生干净实例化错误的情况。
那么我的问题是:如何在ISO Prolog中定义(和命名)相应的安全术语比较谓词?理想情况下,没有任何明确的术语遍历。也许要澄清一下:上面iso_dif/2
没有使用任何明确的术语遍历。两者(\==)/2
和在内部遍历该术语,但是与使用or(\=)/2
的显式遍历相比,这样做的开销非常低。(=..)/2
functor/3, arg/3