z3为什么不能解决这个看似简单的无法解释的功能问题?

时间:2019-08-19 06:28:24

标签: z3 smt

为什么z3无法坐下检查以下内容?

(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,并且从未找到解决方案。 这是未解释功能不想要的吗?

我尝试使用实数并添加一个我期望与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)

1 个答案:

答案 0 :(得分:1)

嗯,这根本不简单。量词很难,正如您所怀疑的那样,SMT求解器不是与它们进行推理的好选择。在您的特定情况下,模型查找器将必须找到一种具有该属性的非常特殊的功能,而该功能远远超出了当前SMT解决技术的能力;老实说,重点。

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