我们可以在Z3中定义关系吗?

时间:2015-10-25 19:53:44

标签: z3 smt sat-solvers

我是z3 SMT求解器的新手。我需要定义一个关系,而不是一个函数。我的意思是一个可以返回多个值的函数。我查阅了教程,找不到任何东西。如果你能在这方面帮助我,我感激不尽。

谢谢你。

3 个答案:

答案 0 :(得分:0)

使用支持 ArrayEx 理论的逻辑之一,该理论提供数组排序以及用于操作数组的相关函数。然后,您可以让函数返回数组值,这些值可以包含任意多个Ints或Bools或其他任何内容。

This SMT tutorial是一个很好的资源,可以将许多SMT细节集中到一个地方。

答案 1 :(得分:0)

从某种意义上说,SMT“自然地”支持关系编程。您可以简单地分离参数的可能值,从而实现所需的结果。类似的东西:

(declare-fun foo ((Int)) Int)
(assert (or (= (foo 3) 4) (= (foo 3) 5)))
(check-sat)
(eval (foo 3))   ; might produce 4 of 5
(assert (distinct (foo 3) 4))
(check-sat)
(eval (foo 3))   ; will produce 5
(assert (distinct (foo 3) 5))
(check-sat)      ; will declare unsat 

以下是foo申请3时,可以生成45。然后你可以断言“进一步”的事实来根据需要约束空间;或者免费。您可以使用此技巧将foo模型化为关系;使SMT求解器表现为关系编程语言..

当然,你真正想要建立关系的方式实际上取决于手头的问题。以上可能不是您问题的最佳选择。

答案 2 :(得分:0)

我认为以下示例可能是您想要的:

(define-fun sqrt ((a Int) (b Int)) Bool
    (= (* b b) a)
)
(declare-const a  Int)
(declare-const b1 Int)
(declare-const b2 Int)
(assert (sqrt a b1))
(assert (sqrt a b2))
(assert (not (= b1 b2)))
(check-sat)
(get-model)

当我打电话给z3时,我得到:

$ z3 -smt2 rel.smt
sat
(model 
  (define-fun b2 () Int
    2)
  (define-fun a () Int
    4)
  (define-fun b1 () Int
    (- 2))
)

sqrt关系只是一组有序对:{(a,b) | a == b*b}(4,2)(4,-2)都属于该关系。在SMT措辞中, 这意味着sqrt(4,2)sqrt(4,-2)均为true。这对应 问题的措词,4可以有多个值。 不幸的是,其他使用foo的答案并没有真正处理关系,而是要求求解器在两个函数之间进行选择