我是z3 SMT求解器的新手。我需要定义一个关系,而不是一个函数。我的意思是一个可以返回多个值的函数。我查阅了教程,找不到任何东西。如果你能在这方面帮助我,我感激不尽。
谢谢你。
答案 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
时,可以生成4
或5
。然后你可以断言“进一步”的事实来根据需要约束空间;或者免费。您可以使用此技巧将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
的答案并没有真正处理关系,而是要求求解器在两个函数之间进行选择。