Z3中有好的机制可以抽象断言吗?我想创建一个“函数”,该函数接受参数并对这些参数进行断言,可能其中包含“局部变量”定义。
想象一下,我有一个String
,并且想断言它代表13到24之间的一个十进制数。我可以编写关于字符串的正则表达式断言的组合,并将其与{{1}组合起来范围声明。我可以直接执行此操作,但是如果要创建许多这样的变量,就可以重复。我可以使用外部语言API,也可以定义在Z3内部返回布尔值的宏/函数,并断言它是真的,但这有点间接。什么是惯用语?我希望Z3像手动编写断言一样容易解决
答案 0 :(得分:2)
您可以使用define-fun
定义布尔函数f
,以便可以(assert (f x y z ...))
,其中f
当然可以是多个条件的结合。 define-fun
将通过Z3的SMT2前端进行内联,即,不应为此花费任何运行时间。
(Z3还支持通过(forall ((x ...)) (= (f x ...) ...))
定义的宏,但是您需要显式应用模型查找器策略来内联它们。)