Z3/SMT-LIB中断言组的抽象

Z3/SMT-LIB中断言组的抽象,z3,smt,Z3,Smt,Z3中是否有好的机制来抽象断言?我想创建一个“函数”,它接受参数并对这些参数进行断言,其中可能包含“局部变量”定义 假设我有一个字符串,我想断言它代表13到24之间的十进制数。我可以编写一组关于字符串的正则表达式断言,并将其与str.to.intrange断言相结合。我可以直接这样做,但是如果我有几十个这样的变量,我想对它们做出断言,它就会重复。我可以使用外部语言API,或者在Z3中定义一个返回布尔值的宏/函数,并断言它是真的,但这感觉有点间接。这里的习惯用语是什么?我希望Z3能够像手工编写断言

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


假设我有一个
字符串
,我想断言它代表13到24之间的十进制数。我可以编写一组关于字符串的正则表达式断言,并将其与
str.to.int
range断言相结合。我可以直接这样做,但是如果我有几十个这样的变量,我想对它们做出断言,它就会重复。我可以使用外部语言API,或者在Z3中定义一个返回布尔值的宏/函数,并断言它是真的,但这感觉有点间接。这里的习惯用语是什么?我希望Z3能够像手工编写断言一样容易地解决问题,你可以使用
define fun
定义一个布尔函数
f
,这样你就可以
(assert(f x y z…)
,其中
f
当然可以是多个条件的结合。
define fun
将由Z3的SMT2前端内联,也就是说,它不应该有任何运行时成本

(Z3还支持通过
定义的宏(对于所有((x…)(=(f x…)
),但需要明确应用model finder策略来内联宏。)