如何处理Z3中的递归函数?

如何处理Z3中的递归函数?,z3,smt,Z3,Smt,我在Z3中尝试了上述代码,但Z3无法回答。您能告诉我哪里出错了吗?作为一般模式,不要期望MBQI生产模型 涉及 只有无限范围的不同值。 如果确实需要,那么可以使用define-fun-rec构造来定义 递归函数。Z3目前相信该定义 格式良好(例如,与函数对应的方程 定义是令人满意的) Z3在搜索期间被动地使用递归定义的函数:无论何时 约束的地面部分有一个候选模型,它 检查候选模型的值是否充分定义了函数图。如果不是,则函数定义将在所选值上实例化,直到在相关值上定义好为止 到地面的约束 (set-o

我在Z3中尝试了上述代码,但Z3无法回答。您能告诉我哪里出错了吗?

作为一般模式,不要期望MBQI生产模型 涉及 只有无限范围的不同值。 如果确实需要,那么可以使用define-fun-rec构造来定义 递归函数。Z3目前相信该定义 格式良好(例如,与函数对应的方程 定义是令人满意的)

Z3在搜索期间被动地使用递归定义的函数:无论何时 约束的地面部分有一个候选模型,它 检查候选模型的值是否充分定义了函数图。如果不是,则函数定义将在所选值上实例化,直到在相关值上定义好为止 到地面的约束

(set-option :smt.mbqi true)
(declare-fun R(Int) Int)
(declare-const a Int)
(assert (= (R 0) 0))
(assert (forall ((n Int)) (=> (> n 0) (= (R n ) (+ (R (- n 1)) 1)))))
(assert (not (= a 5)))
(assert (not (= (R a) 5)))
(check-sat)
(set-option :smt.mbqi true)
(declare-fun F (Int) Int)
(define-fun-rec R ((n Int)) Int
   (if (= n 0) 0
       (if (> n 0) (+ (R (- n 1)) 1)
            (F n))))

(declare-const a Int)
(assert (not (= a 5)))
(assert (not (= (R a) 5)))
(check-sat)
(get-model)