摘要Z3 / SMT-LIB中的断言组

问题描述 投票:2回答:1

Z3中是否有良好的机制来抽象断言?我想创建一个“函数”,它接受参数并对这些参数进行断言,可能包含“局部变量”定义。

想象一下,我有一个String,我想断言它代表一个介于13和24之间的十进制数。我可以写一个关于字符串的正则表达式断言的组合,并将它与str.to.int范围断言结合起来。我可以直接这样做,但如果我有几十个这样的变量,我想做出断言,它就会重复。我可以使用外部语言API,或者可能定义一个宏/函数在Z3中返回一个布尔值并声明它是真的,但这感觉有点间接。什么是惯用的?我希望Z3能够像手工编写断言一样容易解决

z3 smt
1个回答
2
投票

您可以使用define-fun定义布尔函数f,这样您就可以使用(assert (f x y z ...)),其中f当然可以是多个条件的结合。 define-fun将由Z3的SMT2前端内联,即不应该有任何运行时成本。

(Z3还支持通过(forall ((x ...)) (= (f x ...) ...))定义的宏,但您需要明确应用模型查找器策略来内联它们。)

© www.soinside.com 2019 - 2024. All rights reserved.