我的问题与 CLP(FD) 程序中的具体化问题有关的这篇(现在已有 1 年的)帖子有关:链接
我提供给 SWI 引擎的 prolog 文件是即时以编程方式编写的,基于用户可以使用另一个应用程序添加/编辑/删除的一些数据(之后调用引擎的相同)。
我想检测一些特殊情况来动态重写约束以帮助“引擎”找到可能的最小域。一个例子 :
constr(X,Y,Z) :-
X in {1,2,3,4,5,6,7},
Y in {3,5,7},
Z in {1,2},
((X #= 3)) #==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)),
((Z #= 1)) #<==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)).
如果我打电话constr(3,Y,Z).
,我得到Z #= 1
or Z #= 2
。
一种解决方案是自动替换最后两行
((X #= 3)) #==> T,
((Z #= 1)) #<==> T,
T #<==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)).
有了这个我得到Z #= 1.
问题是我可以拥有这个:
((X #= 3)) #==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)),
((Z #= 1)) #<==> ((Y mod 7 #= 0) #\/ (Y mod 3 #= 0)).
如何检测到这一点?Prolog 引擎可以帮助我做到这一点吗?我以为我可以通过具体化变量以编程方式替换每个正确的操作数:
((X #= 3)) #==> J,
((Z #= 1)) #<==> K,
J #<==> ((Y mod 3 #= 0) #\/ (Y mod 7 #= 0)),
K #<==> ((Y mod 7 #= 0) #\/ (Y mod 3 #= 0)).
但在那种情况下,会出现同样的“物化”问题。
谢谢你的帮助。