具有递归函数的错误?

时间:2017-02-11 02:18:39

标签: recursion z3

我在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)
)

这确实是一个合理的答案。

所以,在某些情况下似乎可能存在递归函数模型的错误?

1 个答案:

答案 0 :(得分:1)

模型用于不反映递归函数定义的图形。 因此,当评估在求解期间未见过的值的递归函数时,它可能产生任意结果。此行为现​​在已更改,因为递归定义包含在模型中。