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

时间:2015-08-10 06:19:35

标签: java constraints constraint-programming constraint-satisfaction

我正在研究 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

不幸的是,我对限制编程很新,我遇到了问题。

  1. 在这种情况下,我不完全清楚如何将AST常量映射到整数。 我应该只使用常量数组的索引还是一些哈希函数?

  2. 目前尚不清楚如何处理类型。重写基于int的求解器使其基于长期或使用浮点求解器?

  3. 还不清楚如何处理组合的整数浮点数据。 我意识到直接的解决方案是对整数浮点约束使用浮点求解器。这是真的吗?或者我可以分别解决浮点整数部分约束?

  4. 拜托,有人可以帮帮我吗?一些指示,提示......

    1)目前,d方案已被接受。

1 个答案:

答案 0 :(得分:3)

如果您还要发布您的最终目标(解决的约束实际意味着什么),那将是一件好事。

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

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

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