Z3中的多值逻辑

时间:2016-01-26 12:51:24

标签: logic z3

我已经开发了一个5值命题逻辑,其中存在五个而不是两个真值,我想用Z3来推理这个逻辑。

为了简单起见,假设真值是集{0,...,4}的元素(这实际上是一个简化,但应该足以说明我的问题),它配备了这些元素的自然顺序。由于这个逻辑不再是二进制的,显然需要对运算符进行不同的定义。运营商的例子如下:

  • a and b = min{a, b}
  • a or b = max{a, b}
  • not a = 4 - a

现在,我想使用Z3来推断这个逻辑中的(无量词)公式,例如a or (not b)。但是,我不知道(a)最简单和(b)最有效的方式来教授Z3。

我想一个简单的解决方案是使用枚举排序(尽管我还没有设法定义它们而不会出现错误)来模拟真值和宏来定义运算符。这会是要走的路吗?

2 个答案:

答案 0 :(得分:2)

Enumeration或FiniteDomain排序可能会执行作业或自定义数据类型。而且,可以编码成位向量。根据你想要证明的属性,其中一些可能比其他属性更合适,但我会直接寻找位向量,因为它们支持许多不同的特性和功能,并且它们通常可以有效地解决,至少对于'简单'属性。您的里程可能会有所不同。

答案 1 :(得分:1)

我建议使用以下编码。正如Christoph所说,QF_BV对于给定的问题非常有效。

(set-logic QF_BV)
(define-fun myor ((A (_ BitVec 3)) (B (_ BitVec 3))) (_ BitVec 3)
    (ite (bvugt A B) A B))
(define-fun myand ((A (_ BitVec 3)) (B (_ BitVec 3))) (_ BitVec 3)
    (ite (bvult A B) A B))
(define-fun myneg ((A (_ BitVec 3))) (_ BitVec 3)
    (bvsub #b100 A))
(declare-fun a () (_ BitVec 3))
(assert (bvult a #b101))
(declare-fun b () (_ BitVec 3))
(assert (bvult b #b101))
(declare-fun c () (_ BitVec 3))
(assert (bvult c #b101))

;; test:
(define-fun demorgan () Bool
    (= (myand a b) (myneg (myor (myneg a) (myneg b)))))
(assert (not demorgan))

; (apply (then simplify bit-blast))
(check-sat-using (then simplify solve-eqs (repeat bit-blast) sat) :print_model true)

请注意,对于每个原子命题/变量X,您需要添加(assert (bvult X #b101))