如何使用注释:无模式

时间:2012-11-22 11:27:53

标签: z3

我写了这个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

1 个答案:

答案 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)。