Z3中是否有良好的机制来抽象断言?我想创建一个“函数”,它接受参数并对这些参数进行断言,可能包含“局部变量”定义。
想象一下,我有一个String
,我想断言它代表一个介于13和24之间的十进制数。我可以写一个关于字符串的正则表达式断言的组合,并将它与str.to.int
范围断言结合起来。我可以直接这样做,但如果我有几十个这样的变量,我想做出断言,它就会重复。我可以使用外部语言API,或者可能定义一个宏/函数在Z3中返回一个布尔值并声明它是真的,但这感觉有点间接。什么是惯用的?我希望Z3能够像手工编写断言一样容易解决
您可以使用define-fun
定义布尔函数f
,这样您就可以使用(assert (f x y z ...))
,其中f
当然可以是多个条件的结合。 define-fun
将由Z3的SMT2前端内联,即不应该有任何运行时成本。
(Z3还支持通过(forall ((x ...)) (= (f x ...) ...))
定义的宏,但您需要明确应用模型查找器策略来内联它们。)