Theory "alist_tree"

Parents     alist

Signature

Constant Type
count_append :num -> α list -> α list -> α list
is_insert :bool -> bool -> (α -> α -> bool) -> α -> β -> (α # β) list -> (α # β) list -> bool
is_lookup :bool -> bool -> (α -> α -> bool) -> (α # β) list -> α -> β option -> bool
option_choice_f :(α -> β option) -> (α -> β option) -> α -> β option
sorted_alist_repr :(α -> α -> bool) -> (α # β) list -> (α -> β option) -> bool

Definitions

count_append_def
⊢ ∀n xs ys. count_append n xs ys = xs ++ ys
is_insert_def
⊢ ∀frame_l frame_r R k x al al'.
    is_insert frame_l frame_r R k x al al' ⇔
    irreflexive R ∧ transitive R ⇒
    SORTED R (MAP FST al) ⇒
    (ALOOKUP al' = ALOOKUP ((k,x)::al)) ∧
    (frame_l ⇒ al ≠ [] ∧ (FST (HD al') = FST (HD al))) ∧
    (frame_r ⇒ al ≠ [] ∧ (FST (LAST al') = FST (LAST al))) ∧
    SORTED R (MAP FST al')
is_lookup_def
⊢ ∀fl fr R al x r.
    is_lookup fl fr R al x r ⇔
    ∀xs ys.
      fl ∨ (xs = []) ⇒
      fr ∨ (ys = []) ⇒
      irreflexive R ∧ transitive R ⇒
      SORTED R (MAP FST (xs ++ al ++ ys)) ⇒
      (ALOOKUP (xs ++ al ++ ys) x = r)
option_choice_f_def
⊢ ∀f g. option_choice_f f g = (λx. OPTION_CHOICE (f x) (g x))
sorted_alist_repr_def
⊢ ∀R al f.
    sorted_alist_repr R al f ⇔
    SORTED R (MAP FST al) ∧ irreflexive R ∧ transitive R ∧ (f = ALOOKUP al)


Theorems

DISJ_EQ_IMP
⊢ P ∨ Q ⇔ ¬P ⇒ Q
HD_APPEND
⊢ HD (xs ++ ys) = if xs = [] then HD ys else HD xs
HD_MAP
⊢ xs ≠ [] ⇒ (HD (MAP f xs) = f (HD xs))
HD_MEM
⊢ xs ≠ [] ⇒ MEM (HD xs) xs
LAST_APPEND
⊢ LAST (xs ++ ys) = if ys = [] then LAST xs else LAST ys
alist_repr_choice_trans_left
⊢ sorted_alist_repr R al f ∧
  sorted_alist_repr R al' (option_choice_f (ALOOKUP al) g) ⇒
  sorted_alist_repr R al' (option_choice_f f g)
alist_repr_refl
⊢ ∀al.
    irreflexive R ∧ transitive R ⇒
    SORTED R (MAP FST al) ⇒
    sorted_alist_repr R al (ALOOKUP al)
alookup_append_option_choice_f
⊢ ALOOKUP (xs ++ ys) = option_choice_f (ALOOKUP xs) (ALOOKUP ys)
alookup_empty_option_choice_f
⊢ (option_choice_f (ALOOKUP []) f = f) ∧ (option_choice_f f (ALOOKUP []) = f)
alookup_to_option_choice
⊢ (ALOOKUP (x::y::zs) = option_choice_f (ALOOKUP [x]) (ALOOKUP (y::zs))) ∧
  (option_choice_f (ALOOKUP []) g = g)
balance_l
⊢ count_append i xs (count_append j ys zs) =
  count_append ARB (count_append ARB xs ys) zs
balance_r
⊢ count_append i (count_append j xs ys) zs =
  count_append ARB xs (count_append ARB ys zs)
count_append_HD_LAST
⊢ (HD (count_append i (count_append j xs ys) zs) =
   HD (count_append 0 xs (count_append 0 ys zs))) ∧
  (HD (count_append i (x::xs) ys) = x) ∧ (HD (count_append i [] ys) = HD ys) ∧
  (LAST (count_append i xs (count_append j ys zs)) =
   LAST (count_append 0 (count_append 0 xs ys) zs)) ∧
  (LAST (count_append i xs (y::ys)) = LAST (y::ys)) ∧
  (LAST (count_append i xs []) = LAST xs) ∧ (HD (x::xs) = x) ∧
  (LAST (x::y::zs) = LAST (y::zs)) ∧ (LAST [x] = x) ∧
  ((count_append i (count_append j xs ys) zs = []) ⇔
   (count_append 0 xs (count_append 0 ys zs) = [])) ∧
  ((count_append i [] ys = []) ⇔ (ys = [])) ∧
  ((count_append i (x::xs) ys = []) ⇔ F) ∧ ((x::xs = []) ⇔ F)
empty_is_ALOOKUP
⊢ (λx. NONE) = ALOOKUP []
insert_fl_R
⊢ is_insert fl fr R k x al al' ⇒
  fl ⇒
  SORTED R (MAP FST al) ⇒
  irreflexive R ∧ transitive R ⇒
  (k = FST (HD al)) ∨ R (HD (MAP FST al)) k
insert_fl_R_append
⊢ is_insert T fr R k x r r' ⇒
  SORTED R (MAP FST (l ++ r)) ⇒
  irreflexive R ∧ transitive R ⇒
  ¬MEM k (MAP FST l)
is_insert_centre
⊢ ∀R n k x.
    l ≠ [] ⇒
    R (FST (LAST l)) k ⇒
    r ≠ [] ⇒
    R k (FST (HD r)) ⇒
    is_insert T T R k x (count_append n l r)
      (count_append ARB l (count_append ARB [(k,x)] r))
is_insert_centre_rule
⊢ (fl ⇒ l ≠ []) ⇒
  (l ≠ [] ⇒ R (FST (LAST l)) k) ⇒
  (fr ⇒ r ≠ []) ⇒
  (r ≠ [] ⇒ R k (FST (HD r))) ⇒
  is_insert fl fr R k x (count_append n l r)
    (count_append ARB l (count_append ARB [(k,x)] r))
is_insert_far_left
⊢ ∀R k x xs.
    xs ≠ [] ⇒
    R k (FST (HD xs)) ⇒
    is_insert F T R k x xs (count_append ARB [(k,x)] xs)
is_insert_far_right
⊢ ∀R k x xs.
    xs ≠ [] ⇒
    R (FST (LAST xs)) k ⇒
    is_insert T F R k x xs (count_append ARB xs [(k,x)])
is_insert_l
⊢ ∀n. is_insert fl T R k x l l' ⇒
      is_insert fl T R k x (count_append n l r) (count_append ARB l' r)
is_insert_overwrite
⊢ ∀R k x v. (FST v = k) ⇒ is_insert T T R k x [v] [(k,x)]
is_insert_r
⊢ ∀n. is_insert T fr R k x r r' ⇒
      is_insert T fr R k x (count_append n l r) (count_append ARB l r')
is_insert_to_empty
⊢ ∀R k x. is_insert F F R k x [] [(k,x)]
is_lookup_centre
⊢ ∀R n l r k.
    l ≠ [] ⇒
    R (FST (LAST l)) k ⇒
    r ≠ [] ⇒
    R k (FST (HD r)) ⇒
    is_lookup T T R (count_append n l r) k NONE
is_lookup_empty
⊢ ∀R k al. (al = []) ⇒ is_lookup F F R al k NONE
is_lookup_far_left
⊢ ∀R k k' v. R k k' ⇒ is_lookup F T R [(k',v)] k NONE
is_lookup_far_right
⊢ ∀R k k' v. R k' k ⇒ is_lookup T F R [(k',v)] k NONE
is_lookup_hit
⊢ ∀R k k' v. (k' = k) ⇒ is_lookup T T R [(k',v)] k (SOME v)
is_lookup_l
⊢ ∀n. is_lookup fl T R l x res ⇒ is_lookup fl T R (count_append n l r) x res
is_lookup_r
⊢ ∀n. is_lookup T fr R r x res ⇒ is_lookup T fr R (count_append n l r) x res
lookup_repr
⊢ sorted_alist_repr R al f ∧ is_lookup fl fr R al x r ⇒ (f x = r)
option_choice_f_assoc
⊢ option_choice_f (option_choice_f f g) h =
  option_choice_f f (option_choice_f g h)
repr_insert
⊢ sorted_alist_repr R al f ∧ is_insert fl fr R k x al al' ⇒
  sorted_alist_repr R al' (option_choice_f (ALOOKUP [(k,x)]) f)
set_count
⊢ ∀j. count_append i xs ys = count_append j xs ys
sorted_fst_insert_centre
⊢ ∀k. SORTED R (MAP FST l ++ MAP FST r) ⇒
      (l ≠ [] ⇒ R (FST (LAST l)) k) ⇒
      (r ≠ [] ⇒ R k (FST (HD r))) ⇒
      SORTED R (MAP FST l ++ k::MAP FST r)