如何使用混合数据类型执行约束求解?

How to perform constraint solving with mixed data types?

我正在为 Java 6*1) 开发源到源转换器。

我需要维护负面信息和正面信息,所以我必须为转换器实施小型 约束系统约束系统是CNF公式的限制类,可以定义如下:

(v1 == c1 /\ v2 == c2 ... vn == cn) /\ ((w1,1 != d1,1 \/ w1,2 !== d1,2 ... w1,k != d1,k) /\ (w2,1 != d2,1 \/ ...) /\ ... (wm,1 != dm,1 \/ ... \/ wm,k != dm,k))

其中 vi == ci 等式约束 (替换、变量赋值),

wj != dj,l 不平等约束

vi, wj,l 变量 ,

ci, dj,l 常量(文字)。

常量 类型是 Java 原始类型和映射到整数的引用类型。常量也是任意的类似 AST 的结构(代表部分计算的表达式并且可能包含(元)变量)。

约束系统的工作原理如下:

当转换器达到条件(例如if(x == c) then b else b1)时,约束x == c被添加到约束系统然后 分支和约束 x != c 又被添加到 else 分支的 约束系统 (公式)中。

所以,then分支的新公式是:x == c /\ formula(公式的正数部分是等式的合取);

else分支的新公式是:x != c \/ formula(公式的负部分是不等式的析取的合取).

编辑: 约束系统的可满足性

要使约束系统可满足,必须可以为系统中的变量赋值以满足约束条件。

约束系统满足当且仅当存在替代Theta使得对于每个方程v = cThetav 在句法上与 Thetac 相同,同样,对于每个不等式 w != d Thetaw 在句法上与 Thetad 不同。

不幸的是,我对约束编程还很陌生,遇到了一些问题。

  1. 我不太清楚在这种情况下如何将 AST 常量映射到整数。 我应该简单地使用常量数组的索引还是一些散列函数?

  2. 不清楚如何处理long类型。重写基于 int 的求解器使其成为基于 long 的还是使用浮点求解器?

  3. 也不清楚如何处理组合的 整数浮点数 数据。 据我所知,直接的解决方案是对 整数 浮点 约束使用 浮点 求解器。是真的吗?或者我可以分别解决 floating-pointinteger 部分约束?

拜托,有人可以帮助我吗?一些方向、提示...

1)目前接受source=8 / target=8方案。

如果您也post您的最终目标(解决约束的实际含义是什么),那就太好了。

但是,在我看来,您想知道给定语句中每个变量的可能值集。在这种情况下,您将需要 interval constraint solver

整数和有理区间之间的区别取决于您的用例和您选择的求解器,但通常可以将整数处理为浮点数(这可能会导致您的约束的非整数解)。

重要请记住,您将not be able证明任意 AST 片段的相等性。因此,您要么需要减少所述片段的表达能力(例如,给定阶变量的多项式)或近似相等(例如,引用 same(即相同的上下文,相同的语法,没有副作用)AST 片段。但是,最好将 AST 片段转换为未绑定(或悲观绑定)间隔。