基本上,我想让Z3给我一个值大于10的任意整数。所以我写下面的语句:
(declare-const x (Int))
(assert (forall ((i Int)) (> i 10)))
(check-sat)
(get-value(x))
如何将此量词应用于我的模型?我知道你可以写(assert(> x 10))来实现这一点。但我的意思是我想在我的模型中使用量词,所以每次我声明一个整数常量,其值保证大于10.所以我不必为每个整数常量插入语句(assert(> x 10))我宣布了。
答案 0 :(得分:5)
当您使用(assert (forall ((i Int)) (> i 10)))
时,i
是一个有界变量,量化公式相当于一个真值,在这种情况下为false
。
我想你想用量词来定义一个宏:
(declare-fun greaterThan10 (Int) Bool)
(assert (forall ((i Int)) (= (greaterThan10 i) (> i 10))))
您可以使用它们来避免重复代码:
(declare-const x (Int))
(declare-const y (Int))
(assert (greaterThan10 x))
(assert (greaterThan10 y))
(check-sat)
当您使用Z3 API时,它本质上是使用未解释函数定义宏的方法。请注意,您必须设置(set-option :macro-finder true)
,以便Z3将通用量词替换为这些函数的主体。
但是,如果您正在使用文本界面,SMT-LIB v2中的宏define-fun
可以更轻松地执行您想要的操作:
(define-fun greaterThan10 ((i Int)) Bool
(> i 10))