【问题标题】:Negation in z3 datalog for expressing optimalityz3 数据日志中的否定表示最优性
【发布时间】:2018-03-19 21:44:40
【问题描述】:

我使用 Z3 并将 :fixedpoint.engine 设置为 datalog。 我有一个枚举过滤器关系(f pos min max)。假设我们有(f #x10 #x100000 #x200000)(f #x20 #x150000 #x200000)(f #x20 #x300000 #x500000)

对于给定的x,我搜索最大的pos,使得(f pos min max)min <= x <= max(这里我使用间隔,但过滤器可以任意复杂)。优先级(排序t)和值(排序s)是位向量,但xminmax 位于相当大的空间(例如24 位)

; configuration 
(set-option :fixedpoint.engine datalog)
; sorts
(define-sort s () (_ BitVec 24))
(define-sort t () (_ BitVec 8))
; Relations
(declare-rel f (t s s))
(declare-rel match (t s))
(declare-rel better (t s))
(declare-rel best (t s))
(declare-rel a (t))
(declare-rel b ())
(declare-rel c ())
(declare-var x s)
(declare-var xmin s)
(declare-var xmax s)
(declare-var p t)
(declare-var q t)
; Facts (EDB)
(rule (f #x10 #x100000 #x200000))
(rule (f #x20 #x150000 #x200000))
(rule (f #x20 #x300000 #x500000))
; Rules
(rule (=> (and (f p xmin xmax) (bvule xmin x) (bvule x xmax))
          (match p x)))
(rule (=> (and (match q x) (bvugt q p))
          (better p x)))
(rule (=> (and (match p x) (not (better p x)))
          (best p x)))
; Queries
(rule (=> (match p #x170000) (a p)))
(rule (=> (better #x10 #x170000) b))
(rule (=> (best #x10 #x170000) c))
; output: sat
; (or (= (:var 0) #x20) (= (:var 0) #x10))
(query (a p) :print-answer true)
; output: sat
(query b)
; Output 'WARNING: creating large table of size 16777216 for relation better' and fails
(query c)
  • (match p x) 表示优先级过滤器p 过滤x
  • (better p x) 如果优先级高于 p 的规则过滤 x
  • (best p x)x 匹配的最佳过滤器具有优先级p 的代码。

如果我查询(match p #x170000),我很快就会得到#x10#x20。如果我问(better #x10 #x170000) 我很快就会得到 优先级#20 的答案相同。但是(best p #x170000)上的查询未能在合理的时间和合理的空间内执行。

似乎(not (better p x)) 是独立于(match p x) 计算的,因此由一个非常大的表表示(x 的可能值不会被转发)。在某些情况下,我可以通过一些更好的技巧来限制x(有时我知道我只对明确出现在其他关系中的x 感兴趣),这样可以减少空间,但这是不是真正的通用解决方案,有时我被卡住了。

我应该如何重新表述这个问题,或者我应该使用哪些选项来避免这个问题?

【问题讨论】:

  • 我可以知道为什么这个问题被否决了吗?该示例是人为设计的,但它试图捕捉“匹配”的本质,即在编程语言、防火墙或路由表中采用第一个过滤器(优先级是前缀的长度)。 f 和 match 通常更复杂。
  • 新用户提出的问题最终会由一般的 SO 成员审核,他们可能没有足够的专业知识来理解和公平地判断它,因此有可能投反对票。除了问题描述不包含mcve 之外,我认为这是一个好问题。但是,我不确定是否可以按原样给出具体答案。您可以添加mcve吗?
  • 感谢您的编辑。我添加了所有声明和查询,以便示例可以以z3 test.smt2 运行。

标签: z3 datalog


【解决方案1】:

Z3 的默认 Datalog 表超过了具体值,因此如果您使用较大的位向量,Z3 最终可能会创建巨大的表。 您可以尝试一个更简单的表数据结构,它支持较少的操作但它是稀疏的(使用“不关心”位)。 你可以试试:z3 fixedpoint.engine=datalog fixedpoint.datalog.default_relation=doc file.smt2

【讨论】:

  • 谢谢,是关系类型我没试过。不幸的是,文档似乎不支持位向量比较(在bvule 上失败)至少有一个否定(前两个查询很好)。我试图用更经典的位算术(过滤器由前缀和掩码定义,如果x & mask = prefix 和最长掩码的优先级)匹配我认为更简单的情况,但即使这样我也得到了 Guard 表达式不处理包含=bvorbvnot 的表达式。 doc 支持哪些操作,在哪些情况下支持?
  • 见这里:github.com/Z3Prover/z3/blob/master/src/muz/rel/… 不过添加对 bvor 和类似操作的支持应该很简单......
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2021-12-04
相关资源
最近更新 更多