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

Java 如何使用混合数据类型执行约束求解?,java,constraints,constraint-programming,constraint-satisfaction,Java,Constraints,Constraint Programming,Constraint Satisfaction,我正在为Java6*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是常量

我正在为Java6*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的结构(表示部分计算的表达式,可能包含(元)变量)

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

当变压器达到一个条件时(例如,如果(x==c),则b else b1),约束
x==c
被添加到then分支的约束系统中,约束
x!=c
,依次添加到else分支的约束系统(公式)

因此,then分支的新公式是:
x==c/\formula
(公式的正部分是等式的连词

else分支的新公式为:
x!=c\/formula
(公式的负部分是的析取连词

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

为了使约束系统可满足,必须能够为系统中的变量赋值,从而满足约束

因此,当存在取代基θ时,满足约束系统,使得对于每个等式
v=c
θ
v
在语法上与θ
c
相同,同样,对于每个不等式
w!=d
Theta
w
在语法上与Theta
d
不同

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

  • 在这种情况下,我并不完全清楚如何将AST常量映射为整数。 我应该简单地使用常量数组的索引还是一些散列函数

  • 不清楚如何处理long类型。重写基于int的解算器,使其基于long还是使用浮点解算器

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

  • 拜托,有人能帮我吗?一些指示,提示


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

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

    然而,在我看来,您似乎想知道给定语句中每个变量的可能值集。在这种情况下,您将需要一个

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


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

    谢谢你的回答!不幸的是,我几乎没有发现任何关于未绑定(或悲观绑定)间隔的信息。你对此有什么联系吗?关于这方面的文献不会太多。我的意思是,未经评估的AST片段应该产生间隔(-∞,∞), 或者更确切地说是(min,max),无论您的数字数据类型是什么(例如Int.max)。