2010-08-18 91 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