我正在研究 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 分支的约束系统(公式)中。
因此,然后分支的新公式为:x == c /\ formula
(公式的正部分是等式的结合);
else 分支的新公式是:x != c \/ formula
(公式的负部分是不等式的分离的结合)。
编辑 约束系统的可满足性。
为了使约束系统可以满足,必须可以为系统中的变量赋值,以便满足约束。
如果存在替代 Theta ,约束系统就会得到满足,因此对于每个等式v = c
Theta {{ 1}}在句法上与 Theta v
相同,同样,对于每个不等式c
Theta w != d
在语法上会有所不同来自 Theta w
。
不幸的是,我对限制编程很新,我遇到了问题。
在这种情况下,我不完全清楚如何将AST常量映射到整数。 我应该只使用常量数组的索引还是一些哈希函数?
目前尚不清楚如何处理长类型。重写基于int的求解器使其基于长期或使用浮点求解器?
还不清楚如何处理组合的整数和浮点数据。 我意识到直接的解决方案是对整数和浮点约束使用浮点求解器。这是真的吗?或者我可以分别解决浮点和整数部分约束?
拜托,有人可以帮帮我吗?一些指示,提示......
1)目前,d
方案已被接受。
答案 0 :(得分:3)
如果您还要发布您的最终目标(解决的约束实际意味着什么),那将是一件好事。
但是,在我看来,您想知道给定语句中每个变量的可能值集。在这种情况下,您需要interval constraint solver
整数和有理区间之间的区别取决于您的用例和您选择的求解器,但通常可以将整数作为浮点处理(这可能会导致约束的非整数解)。
重要要记住,您将not be able证明任意AST片段的相等性。因此,您需要降低所述片段的表达能力(例如,在给定顺序的变量上的多项式)或近似相等性(例如,引用相同(即相同的上下文,相同的语法,没有副作用) )AST片段。但是,最好将AST片段转换为未绑定(或悲观绑定)的片段。