如何在Microsoft Z3中执行sin cos操作

时间:2018-01-30 21:31:59

标签: z3 smt

在Microsoft Z3 Dot Net API中,没有执行sin cos操作的功能。当我在网上查看时,我发现可以通过将函数转换为笛卡尔坐标来计算sin和cos函数值。

例如:

if x = cos(theta) and y = sin(theta)
x^2 + y^2 = 1

使用这个逻辑,我们可以为sin cos函数生成值。

我可以生成以下代码:

(set-info :status sat)

(set-option :pp.decimal true)
(set-option :model_validate false)

(declare-fun x () Real)
(declare-fun y () Real)
(declare-fun theta () Real)

(assert (= (cos theta) x))
(assert (= (sin theta) y))
(assert (= (+ (* x x) (* y y)) 1))
(check-sat-using qfnra-nlsat)
(get-model)
(reset)

我现在得到的输出是这样的:

sat
(model 
  (define-fun x () Real
    0.125)
  (define-fun y () Real
    (- 0.9921567416?))
  (define-fun theta () Real
    (+ (acos (- 0.125)) pi))
)

我不清楚的是,如何获得Z3中给定theta的sin(theta)或cos(theta)值?有人可以帮我制作smt代码吗?

什么是"(+(acos( - 0.125))pi))"我得到的结果是什么?

1 个答案:

答案 0 :(得分:3)

我不确定这会在所有可能的情况下起作用(nlsat有点特殊),但您可以使用get-value来获取在模型下评估的任意表达式,例如,在{{之后1}}你可以添加

(check-sat-using ...)

获取

(get-value (theta))
(get-value ((sin theta)))

请注意,((theta (+ (acos (- 0.125)) pi))) (((sin theta) (- 0.9921567416?))) 表示该值已被截断;有选项来调整精度。例如,如果没有?,则将精确结果报告为

pp.decimal=true

(代数)。