为什么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)
答案 0 :(得分:1)
嗯,这根本不简单。量词很难,正如您所怀疑的那样,SMT求解器不是与它们进行推理的好选择。在您的特定情况下,模型查找器将必须找到一种具有该属性的非常特殊的功能,而该功能远远超出了当前SMT解决技术的能力;老实说,重点。
话虽如此,您可以研究量词模式:在某些情况下,您可以帮助电子匹配引擎解决此类问题,但这绝对不是正确的技术。看到这里:https://rise4fun.com/z3/tutorialcontent/guide#h28