注释:no-pattern
需要一个表达式作为参数。如果一个普遍量化的公式F
没有用模式注释,那么 Z3 将启发式地为F
. 注释指示 Z3 中出现:no-pattern
的哪些子表达式F
不应用作模式。这是您的示例(也可在http://rise4fun.com/Z3/KfO5获得):
(declare-sort Set)
(declare-fun mysubset (Set Set) Bool)
(assert
(forall ((A Set) (B Set))
(! (=
(= A B)
(and (mysubset A B) (mysubset B A)))
:no-pattern (mysubset A B))))
(check-sat)
备注:方程(例如,(= A B)
)从未被 Z3 选为模式。
这是另一个示例http://rise4fun.com/Z3/njVu的链接。
顺便说一句,注释:pattern
接受两种参数:表达式;或表达式列表。在 Z3 指南中,我们有注释::pattern ((f (g x))
,其中((f (g x))
是一个长度为 1 的列表,其中包含表达式(f (g x))
。如果我们用 替换:pattern
,:no-pattern
我们会得到一个错误,因为((f (g x))
它不是一个表达式。另一方面,:no-pattern (f (g x)
是一个有效的:no-pattern
注解。
最后,:pattern
接受表达式列表,因为 Z3 支持多模式(指南)。