【问题标题】:How to prove two relations equal in Z3 using HORN logic如何使用 HORN 逻辑证明 Z3 中的两个关系相等
【发布时间】:2016-05-24 12:44:51
【问题描述】:

我在 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 中证明两个集合的等价性。

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

【问题讨论】:

    标签: set z3 smt


    【解决方案1】:

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

    (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)
    

    【讨论】:

    • 非常感谢。因为 Horn 逻辑不支持数组运算,所以我必须使用关系来模拟集合论。最初,如果字母表是 a、b 和 c,我使用 (A a true) (A b true) (A c false) 来表示包含 a 和 b 的集合。但是当域不确定时,这种方法有时会很尴尬。我将细化两个过程,其中包含一些由一些规则生成的列表。所以,我需要否定来找出 P 中的一个列表是否不在 Q 中。似乎 BitVector 可以检查具有有限元素的两个集合。最后,分层否定只支持BitV?
    猜你喜欢
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多