Dictionary SWI序言与dicts冲突

Dictionary SWI序言与dicts冲突,dictionary,prolog,swi-prolog,Dictionary,Prolog,Swi Prolog,适用于x64-win64的SWI Prolog 8.0.3版,对lambdas使用yall。(使用_模块(库(yall))。) 尝试访问labmda中dict中的值会导致错误。 我认为这不是yall的问题,而是dicts的问题……让我们称之为“目标即价值”,因为我不确定正确的术语。(例如,X=(Y=1))代表我实际问题的一个例子是?-L=[S]>>(S=a{X:},S.X=10)。,但我将给出一个简单的例子开始 考虑: ?- L = (S=a{x:_},S.x = 10). ERROR: Arg

适用于x64-win64的SWI Prolog 8.0.3版,对lambdas使用
yall
。(
使用_模块(库(yall))。

尝试访问labmda中dict中的值会导致错误。 我认为这不是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.
回到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中的一个bug,或者至少是一个未记录的限制。我错过了什么,还是应该提交错误报告?

正如您的
L=(S=a{x:},S.x=10)
查询显示,错误与
库(yall)
无关,而是与dicts语义有关。当使用函数表示法时,如在
S.x=10
中,SWI Prolog在查询编译过程中执行
S.x
的渴望评估,即在证明
S=a{x:}
目标之前执行。因此出现了实例化错误。正如您所发现的,通过切换到
”(S,x,10)
目标不使用函数表示法解决了这个问题,因为它成为了在连接上被证明的第二个目标。

这似乎是SWI Prolog中的一个bug,或者至少是一个未记录的限制。我是否遗漏了什么,或者我应该提交错误报告?
?- L = [S]>>(S=a{x:_},(.(S,x,10))).
L = [S]>>(S=a{x:_8692}, '.'(S, x, 10)).