簡體   English   中英

關於實際的推理

[英]Reasoning about reals

我正在嘗試將OpenJML與Z3結合使用,並且我試圖推斷doublefloat值:

class Test {

  //@ requires b > 0;
  void a(double b) {
  }

  void b() {
    a(2.4);
  }
}

我已經發現OpenJML使用AUFLIA作為默認邏輯,它不支持reals 我現在正在使用AUFNIRA

不幸的是,該工具無法證明此類:

→ java -jar openjml.jar -esc -prover z3_4_3 -exec ./z3 Test.java -noInternalSpecs -logic AUFNIRA

Test.java:8: warning: The prover cannot establish an assertion (Precondition: Test.java:3: ) in method b
    a(2.4);
     ^
Test.java:3: warning: Associated declaration: Test.java:8: 
  //@ requires b > 0;
      ^
2 warnings

為什么是這樣?

當涉及雙打時,SMT轉換(用作z3輸入)似乎有問題。 在下面的程序B中,使用雙精度而不是整數,調用或前置條件的常量永遠不會轉換為SMT

這是openjml的錯,而不是z3 - 因為z3需要某種形式(define-fun _JML__tmp3 () Real 2345.0)才能使用(參見程序A的詳細輸出),但openjml從不生成它。 一般來說, 浮點支持似乎是錯誤的

程序A (帶有整數):

class Test {
    //@ requires b > 1234;
    void a(int b) { }
    void z() { a(2345); }
}

輸出(使用-verbose | grep 234運行,以在詳細輸出中搜索12342345提及):

  // requires b > 1234; 
Pre_1 = b > 1234;
    // requires b > 1234; 
    assume Assignment Pre_1_0_21___4 == b_55 > 1234;
(assert (= BL_58bodyBegin_2 (=> (= _JML___exception_49_49___1 NULL) (=> (= _JML___termination_49_49___2 0) (=> (distinct THIS NULL) (=> (or (= THIS NULL) (and (and (distinct THIS NULL) (javaSubType (javaTypeOf THIS) T_Test)) (jmlSubType (jmlTypeOf THIS) JMLT_Test))) (=> (and (<= (- 2147483648) b_55) (<= b_55 2147483647)) (=> (select _isalloc___0 THIS) (=> (= (select _alloc___0 THIS) 0) (=> (= Pre_1_0_21___3 false) (=> (= Pre_1_0_21___4 (> b_55 1234)) (=> Pre_1_0_21___4 BL_49_AfterLabel_3))))))))))))
a(2345);
    // a(2345)
    int _JML__tmp3 = 2345;
    boolean _JML__tmp6 = _JML__tmp3 > 1234;
    // a(2345)
    int _JML__tmp3 = 2345
    boolean _JML__tmp6 = _JML__tmp3 > 1234
(define-fun _JML__tmp3 () Int 2345)
(define-fun _JML__tmp6 () Bool (> _JML__tmp3 1234))

結果:

EXECUTION
Proof result is unsat
Method checked OK
[total 427ms]    

計划B (雙打):

class Test {
    //@ requires b > 1234.0;
    void a(double b) { }
    void z() { a(2345.0); }
}

輸出(使用-verbose | grep 234運行,以在詳細輸出中搜索1234.02345.0提及):

// requires b > 1234.0; 
Pre_1 = b > 1234.0;
    // requires b > 1234.0; 
    assume Assignment Pre_1_0_29___4 == b_72 > 1234.0;
a(2345.0);
    // a(2345.0)
    double _JML__tmp3 = 2345.0;
    boolean _JML__tmp6 = _JML__tmp3 > 1234.0;
    // a(2345.0)
    double _JML__tmp3 = 2345.0
    boolean _JML__tmp6 = _JML__tmp3 > 1234.0
        void z() { a(2345.0); }
        //@ requires b > 1234.0;
Test.java:4:    a(2345.0)
            VALUE: 2345.0    === 0.0

結果:

EXECUTION
Proof result is sat
Some assertion is not valid
Test.java:4: warning: The prover cannot establish an assertion (Precondition: Test.java:2: ) in method z
        void z() { a(2345.0); }
                    ^
Test.java:2: warning: Associated declaration: Test.java:4: 
        //@ requires b > 1234.0;
            ^

您可以在以下鏈接中看到它們如何解釋規范何時不完整。 您的案例顯示的行為與鏈接中的示例相同。 即使你嘗試其他數字,它也會失敗,因為你需要添加更多的openjml子句。

鏈接: http//soft.vub.ac.be/~qstieven/sq/session8.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM