我在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中两组的等价性。
拜托,有谁能给我一个线索?非常感谢。
答案 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)