Exception 在SICStus Prolog中创建_mutable/2

Exception 在SICStus Prolog中创建_mutable/2,exception,prolog,iso-prolog,sicstus-prolog,Exception,Prolog,Iso Prolog,Sicstus Prolog,上的SICStus Prolog手册页面说明: […]统一两个可变项的效果是未定义的 那么,为什么创建可变(数据,x)失败了 这难道不应该引发一个非实例化错误吗 我想不出当上述情况不是一个无意的编程错误(XvsX)时会出现什么情况。。。请帮忙 对于“为什么create_mutable/2在输出统一失败时不抛出异常?”的简短回答是:因为在将该特性添加到SICStus Prolog时就是这样做的,没有人提出强烈的理由来改变这一点 “由open/4创建的流与由create_mutable/2创建的可变

上的SICStus Prolog手册页面说明:

[…]统一两个可变项的效果是未定义的

那么,为什么
创建可变(数据,x)
失败了

这难道不应该引发一个
非实例化错误吗

我想不出当上述情况不是一个无意的编程错误(
X
vs
X
)时会出现什么情况。。。请帮忙

对于“为什么
create_mutable/2
在输出统一失败时不抛出异常?”的简短回答是:因为在将该特性添加到SICStus Prolog时就是这样做的,没有人提出强烈的理由来改变这一点

“由
open/4
创建的流与由
create_mutable/2
创建的可变项之间的一个重要区别是,
open/4
具有副作用,如果调用
open/4
的输出统一失败,这些副作用不会撤消。”

从这个意义上说,
create_mutable/2
更像是
is/2
,如果输出参数是一些非数值的非变量项,例如,
x是3+4
,它也会悄悄地失败。这似乎是Prolog中处理输出参数的常见且传统的方法

我同意,作为第二个参数的非变量很可能是编程错误。SICStus IDE的下一个版本将对此发出警告(正如它已经对is/2所做的那样)


所有这些,以及问题中的示例,似乎都与引用的文档“[…]统一两个可变项的效果[…]”没有直接关系。我看不到由
open/4
创建的流与由
create\u mutable/2
创建的可变项之间的区别。。。将重新读取您链接的文本。@false。还是你真的支持我的推理?错。“那么,为什么……失败了?”“这是正确的。”它确实应该会引发一个
非陈述错误
。谢谢!引用的文件似乎与我有关。原因如下:如果在模式(-,)中使用“类型正确”的
create\u mutable/2
?-create\u mutable(data,X),create\u mutable(datb,X)。
)确实会导致未定义的行为,那么使用类型错误的
create\u mutable(data,X)
。@重复类型检查输出参数最多也有问题。为什么
X=X,create_-mutable(data,X)
目标会抛出异常,而
create_-mutable(data,X),X=X
目标会失败?@PauloMoura。说得好!我正专注于消除一个严重的错误。。。让我把你的问题转回来:为什么
S=S,open(…,S)
目标会抛出异常,而
open(…,S),S=S
目标会失败?整圈;)@保罗莫拉。呵呵。技术上正确!然而,在实践中,这两个“用法”都是符合8.1.3.5“谓词有一个模式和模板的错误,一个模式为-的参数总是与错误相关联”,就像手套一样。@重复前面的方法是区分
-
-
参数,前者允许使用参数绑定进行调用(因此,当传递的项和返回的项之间的统一失败时,这是一个失败),而后者则要求调用未绑定的参数(如果不是这样,则是一个例外)。如果存在未通过回溯撤消的副作用,则将在谓词规范中使用
-
。否则,可以使用
-
。也就是说,当不考虑副作用时,输出参数的类型检查仍然是一个坏主意。