如何使用HORN逻辑证明Z3中的两个关系相等

时间:2016-02-13 09:43:34

标签: set z3 smt

我在Z3中使用Horn Logic来模拟检查CSP(过程代数),因为Horn Logic擅长处理递归定义。但是,我陷入了一些棘手问题。例如,我有以下代码:

(declare-rel A (Int))
(declare-rel B (Int))

(rule (A 1))
(rule (A 2))

(rule (B 1))
(rule (B 2))

然后,我怎样才能证明A和B是平等的。这类似于使用Horn Logic证明Z3中两组的等价性。

拜托,有谁能给我一个线索?非常感谢。

1 个答案:

答案 0 :(得分:0)

有一个引擎支持分层否定。 它仅适用于有限域。使用分层否定你可以 检查等价。例如:

(declare-rel A ((_ BitVec 8)))
(declare-rel B ((_ BitVec 8)))
(declare-rel q ())

(rule (A #x01))
(rule (A #x02))

(rule (B #x01))
(rule (B #x02))

(declare-var x (_ BitVec 8))

(rule (=> (and (A x) (not (B x))) q))
(rule (=> (and (B x) (not (A x))) q))

(query q)