我在z3中尝试递归函数,如果有模型构造的错误,我很好奇。考虑:
(define-fun-rec f ((x Int)) Int
(ite (> x 1)
(f (- x 1))
1))
(check-sat)
(get-value ((f 0)))
这里f
实际上是常量函数1
,只是以愚蠢的方式定义。对于此输入,z3打印:
sat
(((f 0) 0))
这似乎不正确,因为f 0
应该等于1
。
有趣的是,如果我断言z3建议的结果,那么我得到正确的unsat
答案:
(define-fun-rec f ((x Int)) Int
(ite (> x 1)
(f (- x 1))
1))
(assert (= (f 0) 0))
(check-sat)
我明白了:
unsat
所以,看起来z3实际上现在确实f 0
不能是0
;即使它在之前的案例中产生了非常模型。
更进一步,如果我发出:
(define-fun-rec f ((x Int)) Int
(ite (> x 1)
(f (- x 1))
1))
(assert (= (f 0) 1))
(check-sat)
(get-model)
然后z3回复:
sat
(model
(define-fun f ((x!0 Int)) Int
1)
)
这确实是一个合理的答案。
所以,在某些情况下似乎可能存在递归函数模型的错误?
答案 0 :(得分:1)
模型用于不反映递归函数定义的图形。 因此,当评估在求解期间未见过的值的递归函数时,它可能产生任意结果。此行为现在已更改,因为递归定义包含在模型中。