当您使用 时(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 用这些函数的主体替换通用量词。
但是,如果您使用的是文本界面,则define-fun
SMT-LIB v2 中的宏是一种更简单的方法来执行您想要的操作:
(define-fun greaterThan10 ((i Int)) Bool
(> i 10))