我写了这个following assertion:
(assert (!
(forall ((A Set) (B Set))
(=
(= A B)
(and (subset A B)(subset B A)))
:no-pattern)))
为什么会出错“invalid expression, unexpected input
”?为了检查语法错误,我复制了example中的guide,并将:pattern (…)
替换为:no-pattern
。那also yields the error。
答案 0 :(得分:2)
注释:no-pattern
期望表达式作为参数。
如果普遍量化的公式F
没有用模式注释,那么Z3将启发式地选择F
的模式。注释:no-pattern
指示Z3将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的链接。
BTW,注释:pattern
接受两种参数:表达式;或表达式的列表。在Z3指南中,我们有注释::pattern ((f (g x))
,其中((f (g x))
是包含表达式(f (g x))
的长度为1的列表。如果我们将:pattern
替换为:no-pattern
,则会收到错误,因为((f (g x))
不是表达式。另一方面,:no-pattern (f (g x)
是有效的:no-pattern
注释。
最后,:pattern
接受表达式列表,因为Z3支持多模式(guide)。