Z3 在未解释函数中打印/计算值

Z3 在未解释函数中打印/计算值,z3,Z3,我有一个未解释的函数,它的值是通过一些约束计算出来的 Z3给出的模型包含这些语句- (define-fun matrix!2 ((x!1 Int) (x!2 Int)) Int (ite (and (= x!1 0) (= x!2 5)) 10 (ite (and (= x!1 1) (= x!2 5)) 11 (ite (and (= x!1 0) (= x!2 1)) 1 (ite (and (= x!1 0) (= x!2 2)) 3 (ite

我有一个未解释的函数,它的值是通过一些约束计算出来的

Z3给出的模型包含这些语句-

  (define-fun matrix!2 ((x!1 Int) (x!2 Int)) Int
    (ite (and (= x!1 0) (= x!2 5)) 10
    (ite (and (= x!1 1) (= x!2 5)) 11
    (ite (and (= x!1 0) (= x!2 1)) 1
    (ite (and (= x!1 0) (= x!2 2)) 3
    (ite (and (= x!1 0) (= x!2 3)) 5
    (ite (and (= x!1 0) (= x!2 4)) 7
      0)))))))

  (define-fun k!0 ((x!1 Int)) Int
    (ite (>= x!1 0) (ite (>= x!1 1) 1 0) (- 1)))

  (define-fun k!1 ((x!1 Int)) Int
    (let ((a!1 (ite (>= x!1 3) (ite (>= x!1 4) (ite (>= x!1 5) 5 4) 3) 2)))
      (ite (>= x!1 1) (ite (>= x!1 2) a!1 1) 0)))

  (define-fun matrix ((x!1 Int) (x!2 Int)) Int
    (matrix!2 (k!0 x!1) (k!1 x!2)))
现在,我想看看
(矩阵0)、(矩阵2 0)、(矩阵2 2)

问题:

  • 如何使用SMT2格式打印值
  • 使用C API打印它是否可能/容易

  • 下面呢

    (declare-fun m05 () Int)
    (declare-fun m15 () Int)
    (assert (= m05 (matrix 0 5)))
    (assert (= m15 (matrix 1 5)))
    (check-sat)
    (get-model)
    

    啊,是的,谢谢!:)这是否会影响sat解算器的性能?假设我必须看到像这样的200个变量,那么应该没有性能问题。我认为Z3足够聪明,可以“分解并征服”这个问题,因为它可以很好地分解成单独的子问题。试试看!我们还可以使用
    eval
    命令。示例:
    (eval(矩阵0))