【问题标题】:Proving inductive facts in Z3在 Z3 中证明归纳事实
【发布时间】:2012-11-02 15:20:14
【问题描述】:

我试图在微软的 SMT 求解器 Z3 中证明一个归纳事实。我知道 Z3 通常不提供此功能,如 Z3 guide(第 8 节:数据类型)中所述,但是当我们限制要证明事实的域时,这似乎是可能的。考虑以下示例:

(declare-fun p (Int) Bool)
(assert (p 0))

(assert (forall ((x Int)) 
    (=> 
    (and (> x 0) (<= x 20))
    (= (p (- x 1)) (p x) ))))
(assert (not (p 20)))

(check-sat)

求解器正确响应unsat,这意味着(p 20) 有效。问题是,当我们进一步放宽这个约束时(我们将前面示例中的20 替换为任何大于20 的整数),求解器会以unknown 响应。

我觉得这很奇怪,因为 Z3 解决最初的问题并不需要很长时间,但是当我们将上限增加 1 时,它突然变得不可能了。我试图向量词添加一个模式,如下所示:

(declare-fun p (Int) Bool)
(assert (p 0))

(assert (forall ((x Int)) 
    (! (=> 
    (and (> x 0) (<= x 40))
    (= (p (- x 1)) (p x) )) :pattern ((<= x 40)))))
(assert (not (p 40)))

(check-sat)

这似乎更好,但现在上限是 40。这是否意味着我最好不要使用 Z3 来证明这些事实,还是我的问题表述不正确?

【问题讨论】:

    标签: z3 smt


    【解决方案1】:

    Z3 使用许多启发式方法来控制量词实例化。其中之一是基于“实例化深度”。 Z3 用“深度”属性标记每个表达式。所有用户提供的断言都被标记为深度 0。当一个量词被实例化时,新表达式的深度会增加。 Z3 不会使用标记为深度大于预定义阈值的表达式来实例化量词。在您的问题中,达到了阈值:(p 40) 是深度 0,(p 39) 是深度 1,(p 38) 是深度 2,等等。

    要提高阈值,您应该使用以下选项:

    (set-option :qi-eager-threshold 100)
    

    以下是使用此选项的示例:http://rise4fun.com/Z3/ZdxO

    当然,使用这个设置,Z3会超时,比如(p 110)

    未来Z3会对“有界量化”有更好的支持。在大多数情况下,处理这种量词的最佳方法是扩展它。 使用编程 API,我们可以在将表达式发送到 Z3 之前轻松“实例化”表达式。 这是 Python 中的一个示例 (http://rise4fun.com/Z3Py/44lE):

    p = Function('p', IntSort(), BoolSort())
    
    s = Solver()
    
    s.add(p(0))
    s.add([ p(x+1) == p(x) for x in range(40)])
    s.add(Not(p(40)))
    
    print s.check()
    

    最后,在 Z3 中,包含算术符号的模式不是很有效。问题是Z3在求解之前对公式进行了预处理。然后,大多数包含算术符号的模式将永远不会匹配。有关如何有效使用模式/触发器的更多信息,请参阅this article。作者还提供了slide deck

    【讨论】:

    • 谢谢,真的很有帮助!是否有一些可用资源可以提供有关可以设置的所有选项的更多信息?我知道this list,但这相当简洁,我希望在某个地方可能会有更详细的解释。
    • 很遗憾,我们没有详细描述这些选项的文档/页面。我正在尝试将 Z3 移至新的参数设置框架,其中每个组件都有自己的参数和文档。待办事项列表中的另一项是从您在评论中引用的列表中删除过时的选项。
    • 文章和幻灯片的链接已损坏
    • @Kevin 您可以在 moskal.me/pdf/prtrig.pdf 和 moskal.me/pdf/prtrig-slides.pdf 上找到链接
    猜你喜欢
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-10
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多