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