如何使用混合数据类型执行约束求解?
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 = c
Thetav
在句法上与 Thetac
相同,同样,对于每个不等式 w != d
Thetaw
在句法上与 Thetad
不同。
不幸的是,我对约束编程还很陌生,遇到了一些问题。
我不太清楚在这种情况下如何将 AST 常量映射到整数。
我应该简单地使用常量数组的索引还是一些散列函数?
不清楚如何处理long类型。重写基于 int 的求解器使其成为基于 long 的还是使用浮点求解器?
也不清楚如何处理组合的 整数 和 浮点数 数据。
据我所知,直接的解决方案是对 整数 和 浮点 约束使用 浮点 求解器。是真的吗?或者我可以分别解决 floating-point 和 integer 部分约束?
拜托,有人可以帮助我吗?一些方向、提示...
1)目前接受source=8 / target=8
方案。
如果您也post您的最终目标(解决约束的实际含义是什么),那就太好了。
但是,在我看来,您想知道给定语句中每个变量的可能值集。在这种情况下,您将需要 interval constraint solver
整数和有理区间之间的区别取决于您的用例和您选择的求解器,但通常可以将整数处理为浮点数(这可能会导致您的约束的非整数解)。
重要请记住,您将not be able证明任意 AST 片段的相等性。因此,您要么需要减少所述片段的表达能力(例如,给定阶变量的多项式)或近似相等(例如,引用 same(即相同的上下文,相同的语法,没有副作用)AST 片段。但是,最好将 AST 片段转换为未绑定(或悲观绑定)间隔。
我正在为 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 = c
Thetav
在句法上与 Thetac
相同,同样,对于每个不等式 w != d
Thetaw
在句法上与 Thetad
不同。
不幸的是,我对约束编程还很陌生,遇到了一些问题。
我不太清楚在这种情况下如何将 AST 常量映射到整数。 我应该简单地使用常量数组的索引还是一些散列函数?
不清楚如何处理long类型。重写基于 int 的求解器使其成为基于 long 的还是使用浮点求解器?
也不清楚如何处理组合的 整数 和 浮点数 数据。 据我所知,直接的解决方案是对 整数 和 浮点 约束使用 浮点 求解器。是真的吗?或者我可以分别解决 floating-point 和 integer 部分约束?
拜托,有人可以帮助我吗?一些方向、提示...
1)目前接受source=8 / target=8
方案。
如果您也post您的最终目标(解决约束的实际含义是什么),那就太好了。
但是,在我看来,您想知道给定语句中每个变量的可能值集。在这种情况下,您将需要 interval constraint solver
整数和有理区间之间的区别取决于您的用例和您选择的求解器,但通常可以将整数处理为浮点数(这可能会导致您的约束的非整数解)。
重要请记住,您将not be able证明任意 AST 片段的相等性。因此,您要么需要减少所述片段的表达能力(例如,给定阶变量的多项式)或近似相等(例如,引用 same(即相同的上下文,相同的语法,没有副作用)AST 片段。但是,最好将 AST 片段转换为未绑定(或悲观绑定)间隔。