5

我的问题与 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 #= 1or 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)).

但在那种情况下,会出现同样的“物化”问题。

谢谢你的帮助。

4

0 回答 0