Theory Maps
theory Maps
imports Worklist Quasi_Order
begin
locale maps =
fixes empty :: "'m"
and up :: "'a ⇒ 'b list ⇒ 'm ⇒ 'm"
and map_of :: "'m ⇒ 'a ⇒ 'b list"
and M :: "'m ⇒ bool"
assumes map_empty: "map_of empty = (λa. [])"
and map_up: "map_of (up a b m) = (map_of m)(a := b)"
and M_empty: "M empty"
and M_up: "M m ⟹ M (up a b m)"
begin
definition "set_of m = (UN x. set(map_of m x))"
end
locale set_mod_maps = maps empty up map_of M + quasi_order qle
for empty :: "'m"
and up :: "'a ⇒ 'b list ⇒ 'm ⇒ 'm"
and map_of :: "'m ⇒ 'a ⇒ 'b list"
and M :: "'m ⇒ bool"
and qle :: "'b ⇒ 'b ⇒ bool" (infix ‹≼› 60)
+
fixes subsumed :: "'b ⇒ 'b ⇒ bool"
and I :: "'b ⇒ bool"
and key :: "'b ⇒ 'a"
assumes equiv_iff_qle: "I x ⟹ I y ⟹ subsumed x y = (x ≼ y)"
and "key=key"
begin
definition "insert_mod x m =
(let k = key x; ys = map_of m k
in if (∃y ∈ set ys. subsumed x y) then m else up k (x#ys) m)"
end
sublocale
set_mod_maps <
set_by_maps?: set_modulo qle empty insert_mod set_of I M
proof (standard, goal_cases)
case 1 show ?case by(simp add:set_of_def map_empty)
next
case 2 thus ?case
by (auto simp: Let_def insert_mod_def set_of_def map_up equiv_iff_qle
split:if_split_asm)
next
case 3 show ?case by(simp add: M_empty)
next
case 4 thus ?case
by(simp add: insert_mod_def Let_def M_up)
qed
end