我在my Z3 program中使用以下规则,使s
成为排序S
的唯一可能值。
(assert (forall ((t S)) (= t s)))
但是,上述公式会使Z3报告以下错误:
Z3: ERROR: WARNING: failed to find a pattern for quantifier (quantifier id: k!8)
确保特定排序的域只有一个值的正确方法是什么?
答案 0 :(得分:2)
消息
Z3:错误:警告:找不到量词的模式(量词id:k!8)
具有误导性。这只是一个警告,“错误”一词是偶然的。这已得到修复,并将在下一版本中提供。 警告只是告诉用户E匹配模块将忽略量词。 但是,Z3使用许多引擎来处理量化公式。 MBQI模块可以处理这个量化的公式,并为以下问题构建令人满意的分配:
(声明 - 排序S)
(declare-fun s()S)
(断言(forall((t S))(= t s)))
(declare-fun a()S)
(declare-fun b()S)
(断言(= a b))
(检查-SAT)
(模型)
话虽如此,上面的量化公式并不是指定具有单个元素的排序的最佳方式。
您可以使用数据类型来编码枚举类型。
例如,以下命令使用元素e1 ... en定义排序S.
(declare-datatypes ((S e1 e2 … en)))
可以使用以下命令指定仅包含一个元素的排序:
(declare-datatypes ((S e)))
以下示例不可满足:
(declare-datatypes((S elem)))
(declare-const a S)
(declare-const b S)
(断言(不是(= a b)))
(检查-SAT)