arrays - Z3 ForAll 数组

标签 arrays z3 first-order-logic

我已经成功地使用 Z3 创建了一个记录数组,但现在很难看到在数组上执行 $\forall$ 操作所需的语法...这是我的 SMT-LIB2 代码的片段示例到目前为止。

(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$ 操作?

最佳答案

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

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

   (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,那么这些记录就有已婚人。通过这些修改,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)))
)

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

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

关于arrays - Z3 ForAll 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41499358/

相关文章:

java - 是否有任何基于 "Description Logic"或基于 FOL 的推理引擎 Java 库可用?

c# - 在多维 System.Collection.IList 中快速查找

javascript - 使用 Javascript 在 Socket IO 和 NodeJS 中查找数组中的对象

arrays - 为什么我不能在 Swift 中使用数组的 append()?

z3 - Z3如何处理非线性整数运算?

owl - 一阶逻辑支持哪些描述逻辑不支持?

c - 搜索大字符数组时降低 CPU 使用率

z3 - 如何更改 get-model 或 get-value 输出以打印小数而不是分数

z3 - 量词的 C API

logic - 使用一阶逻辑描述电影(实体和属性)