使用Z3和SMT-LIB可获得最多两个值

使用Z3和SMT-LIB可获得最多两个值,z3,smt,Z3,Smt,如何使用smt-lib2获得公式的最大值 我想要这样的东西: (declare-fun x () Int) (declare-fun y () Int) (declare-fun z () Int) (assert (= x 2)) (assert (= y 4)) (assert (= z (max x y)) (check-sat) (get-model) (exit) 当然,smtlibv2不知道“max”。 那么,如何做到这一点呢?您已经得到了abs,并且根据基本数学max(a,b)=

如何使用smt-lib2获得公式的最大值

我想要这样的东西:

(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (= x 2))
(assert (= y 4))
(assert (= z (max x y))
(check-sat)
(get-model)
(exit)
当然,smtlibv2不知道“max”。
那么,如何做到这一点呢?

您已经得到了
abs
,并且根据基本数学
max(a,b)=(a+b+abs(a-b))/2
在Z3中,您可以轻松定义一个宏
max
,并使用它来获得最多两个值:

(define-fun max ((x Int) (y Int)) Int
  (ite (< x y) y x))

请注意,您必须设置
(set option:macro finder true)
,以便在检查可满足性时,Z3能够用函数体替换通用量词。

我知道这是怎么回事了。。。但最后,我想在两个以上的参数(浮点)上使用max(),而不做这种变通。希望有更简单的解决方案;)谢谢。简要说明:
define fun
是SMT-LIB v2标准的一部分。谢谢。。。这确实很好。下一个问题是生成一个接受n个参数(如+)的max函数。我无法让它与“List Int”一起工作。这是怎么做到的?列表的最大值更复杂。定义乐趣只是宏,不允许递归。选项
:宏查找器
将不会检测到“递归宏”。您仍然可以为max int list编写一个“forall”公理。但是,Z3将不完整。也就是说,它可能返回“未知”。更准确地说,对于任何可满足的问题,以及一些可通过Z3中使用的默认搜索限制解决的不可满足的问题,它将返回“未知”。在Z3的未来版本中,我们可以扩展归纳数据类型过程来处理折叠定义。
(declare-fun max (Int Int) Int)
(assert (forall ((x Int) (y Int))
    (= (max x y) (ite (< x y) y x))))