我正在研究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
被添加到then分支的约束系统中,而约束又被添加到else分支的约束系统(公式)中。x != c
因此,then分支的新公式为:(公式的x == c /\ formula
正部分为等式的合取);
else分支的新公式是:(公式的x != c \/ formula
负部分是不等式析取的合取)。
编辑:约束系统的可满足性。
为了使约束系统可满足,必须可以为系统中的变量分配值以使约束得到满足。
因此,如果存在替代Theta则满足约束系统,使得对于每个方程Theta在句法上与Theta相同,同样,对于每个不等式Theta在句法上与Theta不同。 v = c
v
c
w != d
w
d
不幸的是,我对约束编程很陌生,遇到了问题。
在这种情况下,我并不完全清楚如何将 AST 常量映射到整数。我应该简单地使用常量数组的索引还是一些哈希函数?
目前尚不清楚如何处理长类型。重写基于 int 的求解器使其基于 long 或使用浮点求解器?
也不清楚如何处理组合的整数和浮点数据。我意识到直接的解决方案是使用浮点求解器来处理整数和浮点约束。这是真的吗?或者我可以分别解决约束的浮点和整数部分?
请问,有人可以帮我吗?一些方向,提示...
1)目前,source=8 / target=8
方案已被接受。