exception - 为什么 length/2 让我退出全局堆栈?
问题描述
当我提交查询时:
?- X in 1..2, length(List,X).
返回的结果是:
X = 1, List = [_1260];
X = 2, List = [_1260, _1266];
ERROR: Out of global-stack.
ERROR: No room for exception term. Aborting.
% Execution Aborted
我认为发生这种情况是因为 X 没有接地,所以我又运行了 3 个查询,以查看 length/2 bahaves 与非实例化变量作为长度的情况:
?- X in inf..sup, length(List,X).
?- length(List,_).
?- length(List,_X).
并且一切正常。因此,如果 X 不接地,则在达到域的至上之后,length/2 会崩溃。为什么会这样?它不应该返回false吗?
解决方案
为什么会这样?它不应该返回
false
吗?
不,因为length/2
不知道这些界限,它只是建议值,并且每次冻结约束检查都会拒绝这些值。
[ length/2
swi-doc]可以以“建设性”的方式使用。实际上,我们可以生成具有相应长度的列表,例如:
?- length(L, N).
L = [],
N = 0 ;
L = [_2316],
N = 1 ;
L = [_2316, _2322],
N = 2 ;
L = [_2316, _2322, _2328],
N = 3
...
现在您在 上定义了一个约束N
,这意味着如果您设置N
为某个值,Prolog 解释器将检查该值是否在该1..2
范围内。对于每个带有 的值N > 2
,这将因此失败。但length/2
当然不明白这个范围。它将不断建议列表及其相应的长度,并且每次都会失败。
它相当于:
?- length(L, N), member(N, [1, 2]).
L = [_2304],
N = 1 ;
L = [_2304, _2310],
N = 2 ;
ERROR: Out of global-stack.
ERROR: No room for exception term. Aborting.
在这里,反向执行此操作更有意义,例如:
?- member(N, [1,2]), length(L, N).
N = 1,
L = [_3372] ;
N = 2,
L = [_3372, _3378].
或者,如果这不是一个选项,请尝试freeze/2
[swi-doc]构建列表,直到N
已知为止。
推荐阅读
- amazon-web-services - 是 Istio 还是 AWS App Mesh 用于 EKS 上的服务网格实施
- ffmpeg - 如何在不使用 FFmpeg 重新编码的情况下连接 MTS 视频并应用过滤器?
- python - 如何在不创建新键的情况下访问 for 循环中的现有 dict 键?
- linux - 有没有办法将基于 dd 的文件挂载为 cstore 池的磁盘
- python - 如何在不使用“全局”的情况下更改 Python 函数中的变量
- css - 响应式柱廊,保持独立滚动
- vaadin - 带有 HTML 标签的 Vaadin 14 LoginI18n?
- c++ - 在哪里可以找到有关阅读 OutputDebugString() 消息的官方文档?
- php - laravel formrequest 在中间件之前
- python-3.x - 如何使用 python 自动化 MS Word