【发布时间】:2018-10-02 01:57:28
【问题描述】:
我想在 Z3 中对部分地图进行编码,支持询问地图是否是为某个键定义的。
它还应该支持(update_map m1 m2) 操作,它使用m2 中的映射更新m1,从而m2 的映射覆盖m1 的映射。
我尝试使用数组和自定义option 数据类型对其进行编码,并且我公理地指定了update_map 函数。但是,似乎 Z3 甚至无法处理我的 update_map 规范:它在以下代码上返回 unknown:
(declare-datatypes (T) ((option None (Some (option-value T)))))
(define-sort map (K V) (Array K (option V)))
(declare-sort V)
(declare-sort K)
(define-const empty_map (map K V)
((as const (Array K (option V))) None))
(define-fun get ((m (map K V)) (k K)) (option V)
(select m k))
(define-fun put ((m (map K V)) (k K) (v V)) (map K V)
(store m k (Some v)))
(declare-fun update_map ((map K V) (map K V)) (map K V))
(assert (forall ((m1 (map K V)) (m2 (map K V)) (k K))
(=> (= (get m2 k) None)
(= (get (update_map m1 m2) k) (get m1 k)))))
(assert (forall ((m1 (map K V)) (m2 (map K V)) (k K) (v V))
(=> (= (get m2 k) (Some v))
(= (get (update_map m1 m2) k) (Some v)))))
(check-sat)
所以我有两个问题:
- 是否有更好的方法来编码地图,使我能够证明关于
update_map的事实? - 谁能分享一些关于为什么 Z3 不理解这个规范的直觉?例如,让 Z3 难以做到这一点的“核心功能”是什么? [我已经知道量词被认为是困难的并且一阶逻辑是不可判定的,我正在寻找更具体的东西;-)]
【问题讨论】: