dictionary - SWI-Prolog YALL 与 dicts 冲突
问题描述
适用于 x64-win64 的 SWI-Prolog 版本 8.0.3,yall
用于 lambda。( use_module(library(yall)).
)
尝试在 labmda 中访问 dict 中的值会导致错误。我认为这不是 dicts 的问题yall
,而更多的是 dicts 的问题......让我们称它们为“目标即价值”,因为我不确定正确的术语。(例如,X = (Y = 1)
。)代表我的实际问题的示例是?- L = [S]>>(S=a{x:_},S.x = 10).
,但我将举一个更简单的示例开始。
考虑:
?- L = (S=a{x:_},S.x = 10).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [11] throw(error(instantiation_error,_11412))
ERROR: [8] '<meta-call>'(user:(...,...)) <foreign>
ERROR: [7] <user>
ERROR:
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
当我期望类似以下内容时:
?- L = (S=a{x:_},S.x = 10).
L = (S=a{x:_14168}, S.x=10).
回到 lambdas,请注意我的意图可以实现,例如
?- L = [S]>>(S=a{x:_},(.(S,x,10))).
L = [S]>>(S=a{x:_8692}, '.'(S, x, 10)).
这有点可怕。(正如预期的那样,调用这个 lambda 会产生S = a{x:10}
。)
这似乎是 SWI-Prolog 中的一个错误,或者至少是一个未记录的限制。我错过了什么,还是应该提交错误报告?
解决方案
正如您的查询所示,该错误与 dicts 语义L = (S=a{x:_},S.x = 10)
无关。library(yall)
当使用功能表示法时S.x = 10
,SWI-Prolog在查询编译期间(即在证明目标之前)执行急切评估。因此实例化错误。正如您所发现的,通过切换到目标不使用功能符号可以解决问题,因为它成为在合取上被证明的第二个目标。S.x
S=a{x:_}
'.'(S, x, 10)
推荐阅读
- powershell - 方法调用失败,因为 system.string 不包含名为“WaitForStatus”的方法
- java - 无法使用 OkHttpClient 将自定义标头添加到请求有效负载
- javascript - 根据另一个数字的百分比从范围中选择一个数字
- python - 无法导入 FieldValue.arrayUnion
- c# - 测试完成 12.0 连接到 pid
- r - 数据帧的 dcast(reshape2 包)错误
- excel - 有什么办法可以在 VBA excel 中压缩此代码?也许使用循环或函数
- assembly - NASM 是否在 32 位 x86 生成的机器指令中包含段寄存器?
- selenium - Selenium 节点未回复 /status HTTP-Request
- html - 在列框上对齐图像的一半