2010-08-18 86 views
3

你知道一个我可以用来比较约束(不仅是数学)的工具吗?这是更容易的例子来解释:约束比较器

A)简单的例子

C1: x < 0 && y * y < x 
C2: x < 0 && y * y < x - 1 

我想知道,如果C2是强则C1,它是。这意味着C2的(x,y)也在C1中。

B)复杂的例子

C1: x > 0 && y > 0 
C2: x > 0 

C2较弱则C1,因为它不含有Y上的约束。

我可以试着手写东西,但我不认为这是一个解决方案。我知道解决约束的问题是不可判定的,但我想知道在这方面做了哪些工作。

谢谢,

+0

出于好奇,在什么情况下你可能需要这样做? – Nobody 2010-08-18 11:03:15

+0

我正在研究分析代码库并生成一些报告的项目。例如private foo(int x){if(x <0)抛出new RuntimeException(); }它从bar(){return foo(2 * x); }。我试图在bar()中报告,在不满足前提条件的情况下调用方法(对于foo(),x> = 0)。如果bar是{if(x <0)x = -x;返回foo(2 * x); }那么一切都会好的。 – 2010-08-18 11:09:11

回答

0

您是否试图确定约束C1是否包含C2(意思是不可能找到一组满足C1且不满足C2并且不满足C2 - > C2的值在所有情况下均为真,但可能而不是相反)?当C1包含C2时,C2可以被删除,因为它不会将任何语义添加到问题中。

如果是这种情况,我建议您为此使用CSP解算器。它比看起来更容易。例如,Eclipse CSP求解器(这里的Eclipse不反驳IDE平台,求解器具有相同的名称)可以通过定义良好的API从Java程序轻松调用,因此您可以将问题发送给解算器,看哪个约束更弱

+0

感谢您的回答,我会尝试Eclipse CSP求解器,会给你“问题回答”;-)。 – 2010-08-20 13:25:01

0

这是一个有趣的问题!你可以编写一个脚本来解析每个约束,并检查每个约束的单独比较数,尽管我不确定这是否是衡量它们的最好方法。

+0

我认为这是微不足道的。我可以为我的案例编写一个虚拟工具,但我认为有人曾经这样做过。 – 2010-08-18 11:05:53

+0

单独比较的数量不会让你变得更强/更弱的链接,是吗?例如,他的第一个例子在每种情况下都有相同数量的比较,但它们并不一样强。 – Stephen 2010-08-18 11:09:10

+0

不,因为我没有正常形式的约束(最简单的可能)。我可以有这样的东西:x <0 && x * x> 0 && x * x * x <0等等,这实际上是x <0 – 2010-08-18 11:11:07