为什么可以';TZ3解决了这个看似简单却不令人惊讶的函数问题吗?

为什么可以';TZ3解决了这个看似简单却不令人惊讶的函数问题吗?,z3,smt,Z3,Smt,为什么z3无法进行以下sat检查 (declare-fun f (Int) Int) (assert (forall ((a Int) (b Int)) (= (+ (f a) (f b) ) (f (+ a b))))) (assert (= (f 1) 1)) (check-sat) (get-model) 我希望得到类似于f(x)=x的结果,但是z3似乎消耗了越来越多的ram,而且从未找到解决方案。 这是不是有些意想不到的功能不适用 我尝试使用reals并添加一个与f相同的附加函数,如下

为什么z3无法进行以下sat检查

(declare-fun f (Int) Int)
(assert (forall ((a Int) (b Int)) (= (+ (f a) (f b) ) (f (+ a b)))))
(assert (= (f 1) 1))
(check-sat)
(get-model)
我希望得到类似于
f(x)=x
的结果,但是z3似乎消耗了越来越多的ram,而且从未找到解决方案。 这是不是有些意想不到的功能不适用

我尝试使用reals并添加一个与f相同的附加函数,如下所示:

(declare-fun f (Real) Real)
(declare-fun g (Real) Real)
(assert (forall ((a Real)) (= (g a) a)))
(assert (forall ((a Real) (b Real)) (= (+ (f a) (f b) ) (f (+ a b)))))
(assert (= (f 1) 1))


(check-sat)
(get-model)

这一点都不简单。量词很难使用,正如您所怀疑的,SMT解算器不是一个很好的选择。在您的特定情况下,ModelFinder必须找到一种具有该属性的非常特定的函数,这远远超出了当前SMT解决技术的能力;老实说,这是重点

话虽如此,您可以研究量词模式:在某些情况下,您可以帮助电子匹配引擎解决此类问题,但这绝对不是正确的技术。请看这里: