Recursion 递归函数的Bug?

Recursion 递归函数的Bug?,recursion,z3,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))

我正在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))
这似乎不正确,因为
f0
应该等于
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现在真的做到了,
f0
不能是
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)
)
这确实是一个合理的答案


因此,在某些情况下,递归函数模型似乎存在缺陷?

用于不反映递归函数定义图的模型。
因此,当对求解过程中未看到的值求值递归函数时,可能会产生任意结果。随着递归定义包含在模型中,这种行为现在发生了变化。

我将把这个问题留在这里,以防有人有任何想法。。但我也将其作为一个可能的bug提交到: