如何在SMT-LIB中定义谓词

时间:2015-03-02 02:41:24

标签: predicate smt

我如何定义一个谓词,例如even: Int -> Bool,它取一个整数并输出它是否是偶数?

我试过像

这样的东西
(set-logic AUFNIRA)
(declare-fun even (Int) Bool)

我想知道如何声明,例如,even(2)是真的。

1 个答案:

答案 0 :(得分:3)

大约有3种方法可以做到这一点。

  1. 您可以使用解释谓词(_ divisible 2)

    (assert ((_ divisible 2) 6))
    

    您甚至可以使用define-fun来捕捉。

    (define-fun even ((x Int)) Bool ((_ divisible 2) x))
    

    请注意,这可能不是您选择的逻辑,例如QF_LIA

  2. 您可以声明未解释的谓词,并定义 它的语义点。

    (declare-fun even (Int) Bool)
    (assert (even 2))
    (assert (not (even 3)))
    
  3. 您可以声明未解释的谓词并定义 它通过量词的语义。

    (declare-fun even (Int) Bool)
    (assert (forall ((x Int)) (= (even x) (exists ((y Int)) (= x (* 2 y))))))