为什么Z3的`get-value`返回表达式而不是具体值?

时间:2012-03-16 19:08:46

标签: z3

get-value调用返回表达式而不是具体值#b01

  sat
  (((trans_local true true (_ bv2 2)) (ite #b10 #b01 (ite #b00 (ite #b10 #b11 #b01) (ite #b01 (ite #b10 #b10 #b00) #b01)))))

simplify以相同的方式产生(并且它可能应该)。我应该如何使用get-value来获得正确的结果?

以下是查询:

  (set-logic UFBV)
  (set-option :produce-models true)

  (define-fun trans_local ((x!1 (_ BitVec 2)) (x!2 Bool) (x!3 Bool)) (_ BitVec 2)
  (ite (= x!1 #b10)
   (ite x!2 #b01 #b00)
   (ite (= x!1 #b00)
    (ite (and x!2 x!3) 
     #b11 
     (ite (and (not x!2) x!3)
      #b10
      (ite (and (not x!2) (not x!3)) #b00 #b01)))
    (ite (= x!1 #b01) (ite (and x!2 x!3) #b10 (ite (and (not x!2) x!3) #b10 #b00)) #b01)))
  )

  (check-sat)

  (get-value ((trans_local true true (_ bv2 2))))

1 个答案:

答案 0 :(得分:2)

你的表情没有很好的分类。在Z3中,define-fun本质上是一个宏。 Z3 3.2不检查宏应用程序是否排序良好。所以,你没有得到任何错误信息。这已得到修复,修复程序将在下一版本中提供:Z3 4.0。 话虽如此,您可以通过修复get-value语句中的排序错误来获得预期结果。我想,你打算写:

  (get-value ((trans_local (_ bv1 2) true true)))