Я хотел закодировать частичные карты в Z3, с поддержкой вопроса о том, определена ли карта для определенного ключа.
Он также должен поддерживать операцию (update_map m1 m2)
, которая обновляет m1
с отображениямив m2
таким образом, что сопоставления 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?[Я уже знаю, что кванторы считаются сложными, а логика первого порядка неразрешимой, я ищу что-то более конкретное; -)]