【问题标题】:Z3 ForAll on Arrays阵列上的 Z3 ForAll
【发布时间】:2017-01-06 05:17:28
【问题描述】:

我已经设法使用 Z3 创建了一个记录数组,但现在我正在努力查看对数组执行 $\forall$ 操作所需的语法...这里是 SMT-LIB2 的 sn-p 示例我到目前为止的代码。

(declare-datatypes () ((rec (mk-R5 (age Int) (area Int) (married Bool)))))
(declare-const recs (Array Int rec))
(declare-const r1 rec)
(assert(= (age r1) 15))
(assert(= (area r1) 10001))
(assert(= (married r1) true))
(declare-const r2 rec)
(assert(= (age r2) 35))
(assert(= (area r2) 2845))
(assert(= (married r2) true))
(declare-const x Int)
(declare-const y Int)
(assert (= recs (store recs x r1)))
(assert (= recs (store recs y r2)))
(assert(forall ((i rec)) (= (married i) true)))
(check-sat)
(get-model)

我猜倒数第三行应该对数组有一些参考,但我已经尝试了所有方法,教程并没有帮助我解决这个问题。

如何对这里的数组执行 $\forall$ 操作?

【问题讨论】:

    标签: arrays z3 first-order-logic


    【解决方案1】:

    您似乎正试图将两条记录放入一个数组中,然后对这些元素进行说明。不幸的是,您的编码并不完全意味着那个。

    首先要注意的是下面这行的含义:

       (declare-const recs (Array Int rec))
    

    这表示recs 是一个由所有 个整数索引的数组。也就是说,域是所有 Int 值的集合。这可能不是你的意思。

    还有以下几行:

    (assert (= recs (store recs x r1)))
    (assert (= recs (store recs y r2)))
    

    最好这样写:

    (assert (= (select recs x) r1))
    (assert (= (select recs y) r2))
    

    把它想象成你对索引xy的了解;与您尝试编写时“修改”recs 的一些命令式赋值语句相反。没有修改 smt-lib 中任何值的概念;您只需陈述您所知道的关于您正在构建的模型的真实情况。

    修复你的 forall-assertion 的一种方法是这样写:

    (assert (forall ((i Int)) 
                    (implies (or (= i x) (= i y)) 
                             (= (married (select recs i)) true))))
    

    我们对索引进行量化,并说如果索引是iy,那么这些记录有married 人。通过这些修改,Z3 做出回应:

    sat
    (model
      (define-fun r2 () rec
        (mk-R5 35 2845 true))
      (define-fun recs () (Array Int rec)
        (_ as-array k!0))
      (define-fun y () Int
        1)
      (define-fun x () Int
        0)
      (define-fun r1 () rec
        (mk-R5 15 10001 true))
      (define-fun k!0!2 ((x!0 Int)) rec
        (ite (= x!0 1) (mk-R5 35 2845 true)
          (mk-R5 15 10001 true)))
      (define-fun k!1 ((x!0 Int)) Int
        (ite (= x!0 0) 0
          1))
      (define-fun k!0 ((x!0 Int)) rec
        (k!0!2 (k!1 x!0)))
    )
    

    这有点难以阅读,但它确实为您提供了您指定的模型。

    然而,在我看来,这并不是您真正想要建模的;但很难从你的问题中看出。如果您描述您要解决的实际问题,答案可能会更有帮助。

    【讨论】:

    • “这表示 recs 是一个由所有整数索引的数组。也就是说,域是所有 Int 值的集合。这可能不是你的意思。”确实...有什么选择。谢谢。我在处理这个伟大产品的文档时遇到了一些困难
    • 您仍然可以使用这样的数组,但是无论何时您对它进行索引,您都必须将自己限制在范围内的索引上。您可以通过明确声明索引可以采用的值来做到这一点。同样,这取决于您要建模的内容;在不了解实际问题的情况下不可能提出任何建议。
    猜你喜欢
    • 2020-12-15
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2015-01-11
    • 2016-05-24
    • 1970-01-01
    相关资源
    最近更新 更多