Theory enumeral

Parents

Contents

Type operators

Constants

Definitions

BL_ACCUMBL_CONSK2LESS_ALLOLOL_btOL_bt_lbOL_bt_lb_ubOL_bt_ubOUOWLUOblMAP_defblREL_defblSET_defbl_case_defbl_revbl_size_defbl_to_btbl_to_setbtMAP_defbtREL_defbtSET_defbt_case_defbt_revbt_size_defbt_to_blbt_to_listbt_to_list_acbt_to_olbt_to_ol_acbt_to_ol_lbbt_to_ol_lb_acbt_to_ol_lb_ubbt_to_ol_lb_ub_acbt_to_ol_ubbt_to_ol_ub_acbt_to_setbt_to_set_lbbt_to_set_lb_ubbt_to_set_ubincr_sbuildincr_ssortlist_to_bllist_to_btlol_set_primitive

Theorems

AND_CONV_conjEMPTY_OUENUMERAL_setEQUAL_FEQ_EQUAL_REWREQ_GREATER_REWREQ_LESS_REWRGREATER_FIN_bt_to_setIN_nodeLESS_ALL_OULESS_ALL_OU_UO_LEMLESS_ALL_UO_LEMLESS_UO_LEMLIST_TO_SET_CONSLIST_TO_SET_NILNOT_IN_ntOL_DIFF_IMPOL_ENUMERALOL_INTER_IMPOL_UNION_IMPOL_bt_to_olOL_bt_to_ol_lbOL_bt_to_ol_lb_ubOL_bt_to_ol_ubOL_sublistsOL_sublists_indOU_ASSOCOU_EMPTYOWL_DIFF_THMOWL_INTER_THMOWL_UNION_THMOWL_bt_to_olbetter_bt_to_olblMAP_indblMAP_thmblSET_indblSET_thmbl_11bl_Axiombl_MAP_CONGbl_MAP_IDbl_MAP_IMAGEbl_MAP_Obl_bndbl_case_congbl_case_eqbl_distinctbl_inductionbl_inhbl_nchotomybl_witbtMAP_indbtMAP_thmbtSET_indbtSET_thmbt_11bt_Axiombt_MAP_CONGbt_MAP_IDbt_MAP_IMAGEbt_MAP_Obt_bndbt_case_congbt_case_eqbt_distinctbt_inductionbt_inhbt_nchotomybt_to_list_thmbt_to_ol_ID_IMPbt_witdatatype_bldatatype_btincr_smergeincr_smerge_OLincr_smerge_indlol_setlol_set_indol_setsdiffsdiff_indset_OWL_thmsintersinter_indsmergesmerge_OLsmerge_indsmerge_nilsmerge_outsmerge_out_ind

Definitions

|- (!a ac. BL_ACCUM a ac nbl = onebl a ac nbl) /\
   (!a ac bl. BL_ACCUM a ac (zerbl bl) = onebl a ac bl) /\
   !a ac r rft bl.
     BL_ACCUM a ac (onebl r rft bl) = zerbl (BL_ACCUM a (node ac r rft) bl)
|- !a bl. BL_CONS a bl = BL_ACCUM a nt bl
|- !a. K2 a = 2
|- !cmp x s. LESS_ALL cmp x s <=> !y. y IN s ==> (apto cmp x y = LESS)
|- (!cmp. OL cmp [] <=> T) /\
   !cmp a l.
     OL cmp (a::l) <=> OL cmp l /\ !p. MEM p l ==> (apto cmp a p = LESS)
|- (!cmp. OL_bt cmp nt <=> T) /\
   !cmp l x r.
     OL_bt cmp (node l x r) <=> OL_bt_ub cmp l x /\ OL_bt_lb cmp x r
|- (!cmp lb. OL_bt_lb cmp lb nt <=> T) /\
   !cmp lb l x r.
     OL_bt_lb cmp lb (node l x r) <=>
     OL_bt_lb_ub cmp lb l x /\ OL_bt_lb cmp x r
|- (!cmp lb ub. OL_bt_lb_ub cmp lb nt ub <=> (apto cmp lb ub = LESS)) /\
   !cmp lb l x r ub.
     OL_bt_lb_ub cmp lb (node l x r) ub <=>
     OL_bt_lb_ub cmp lb l x /\ OL_bt_lb_ub cmp x r ub
|- (!cmp ub. OL_bt_ub cmp nt ub <=> T) /\
   !cmp l x r ub.
     OL_bt_ub cmp (node l x r) ub <=>
     OL_bt_ub cmp l x /\ OL_bt_lb_ub cmp x r ub
|- !cmp t u.
     OU cmp t u =
     {x | x IN t /\ !z. z IN u ==> (apto cmp x z = LESS)} UNION u
|- !cmp s l. OWL cmp s l <=> (s = set l) /\ OL cmp l
|- !cmp s t.
     UO cmp s t =
     s UNION {y | y IN t /\ !z. z IN s ==> (apto cmp z y = LESS)}
blMAP_def
|- !f af.
     blMAP f (bl_CONS af) =
     bl_CONS (SUM_MAP I (SUM_MAP (blMAP f) (f ## btMAP f ## blMAP f)) af)
blREL_def
|- blREL =
   (\R x y.
      ?z. (!p. p IN blSET z ==> R (FST p) (SND p)) /\ (blMAP FST z = x) /\
          (blMAP SND z = y))
blSET_def
|- !af.
     blSET (bl_CONS af) =
     S ($UNION o BIMG (K {}) o setL)
       (BIMG
          (S ($UNION o BIMG (K {}) o setL)
             (BIMG
                (S ($UNION o BIMG $= o setFST)
                   (BIMG
                      (S ($UNION o BIMG (BIMG $= o btSET) o setFST)
                         (BIMG (K {}) o setSND)) o setSND)) o setR)) o setR)
       af UNION
     BIGUNION
       (IMAGE blSET
          (S ($UNION o BIMG (K {}) o setL)
             (BIMG
                (S ($UNION o BIMG $= o setL)
                   (BIMG
                      (S ($UNION o BIMG (K {}) o setFST)
                         (BIMG
                            (S
                               ($UNION o BIMG (BIMG (K {}) o btSET) o
                                setFST) (BIMG $= o setSND)) o setSND)) o
                    setR)) o setR) af))
bl_case_def
|- (!v f f0. bl_CASE nbl v f f0 = v) /\
   (!a0 v f f0. bl_CASE (zerbl a0) v f f0 = f a0) /\
   !a0 a1 a2 v f f0. bl_CASE (onebl a0 a1 a2) v f f0 = f0 a0 a1 a2
|- (!ft. bl_rev ft nbl = ft) /\
   (!ft b. bl_rev ft (zerbl b) = bl_rev ft b) /\
   !ft a f b. bl_rev ft (onebl a f b) = bl_rev (node ft a f) b
bl_size_def
|- (!f0. bl_size f0 nbl = 0) /\
   (!f0 a0. bl_size f0 (zerbl a0) = 1 + bl_size f0 a0) /\
   !f0 a0 a1 a2.
     bl_size f0 (onebl a0 a1 a2) =
     1 + (f0 a0 + (bt_size f0 a1 + bl_size f0 a2))
|- bl_to_bt = bl_rev nt
|- (!cmp. bl_to_set cmp nbl = {}) /\
   (!cmp b. bl_to_set cmp (zerbl b) = bl_to_set cmp b) /\
   !cmp x t b.
     bl_to_set cmp (onebl x t b) =
     OU cmp ({x} UNION {y | y IN ENUMERAL cmp t /\ (apto cmp x y = LESS)})
       (bl_to_set cmp b)
btMAP_def
|- !f af.
     btMAP f (bt_CONS af) =
     bt_CONS (SUM_MAP I (btMAP f ## f ## btMAP f) af)
btREL_def
|- btREL =
   (\R x y.
      ?z. (!p. p IN btSET z ==> R (FST p) (SND p)) /\ (btMAP FST z = x) /\
          (btMAP SND z = y))
btSET_def
|- !af.
     btSET (bt_CONS af) =
     S ($UNION o BIMG (K {}) o setL)
       (BIMG
          (S ($UNION o BIMG (K {}) o setFST)
             (BIMG (S ($UNION o BIMG $= o setFST) (BIMG (K {}) o setSND)) o
              setSND)) o setR) af UNION
     BIGUNION
       (IMAGE btSET
          (S ($UNION o BIMG (K {}) o setL)
             (BIMG
                (S ($UNION o BIMG $= o setFST)
                   (BIMG
                      (S ($UNION o BIMG (K {}) o setFST) (BIMG $= o setSND)) o
                    setSND)) o setR) af))
bt_case_def
|- (!v f. bt_CASE nt v f = v) /\
   !a0 a1 a2 v f. bt_CASE (node a0 a1 a2) v f = f a0 a1 a2
|- (!bl. bt_rev nt bl = bl) /\
   !lft r rft bl. bt_rev (node lft r rft) bl = bt_rev lft (onebl r rft bl)
bt_size_def
|- (!f0. bt_size f0 nt = 0) /\
   !f0 a0 a1 a2.
     bt_size f0 (node a0 a1 a2) =
     1 + (bt_size f0 a0 + (f0 a1 + bt_size f0 a2))
|- !t. bt_to_bl t = bt_rev t nbl
|- (bt_to_list nt = []) /\
   !l x r. bt_to_list (node l x r) = bt_to_list l ++ [x] ++ bt_to_list r
|- (!m. bt_to_list_ac nt m = m) /\
   !l x r m.
     bt_to_list_ac (node l x r) m = bt_to_list_ac l (x::bt_to_list_ac r m)
|- (!cmp. bt_to_ol cmp nt = []) /\
   !cmp l x r.
     bt_to_ol cmp (node l x r) =
     bt_to_ol_ub cmp l x ++ [x] ++ bt_to_ol_lb cmp x r
|- (!cmp m. bt_to_ol_ac cmp nt m = m) /\
   !cmp l x r m.
     bt_to_ol_ac cmp (node l x r) m =
     bt_to_ol_ub_ac cmp l x (x::bt_to_ol_lb_ac cmp x r m)
|- (!cmp lb. bt_to_ol_lb cmp lb nt = []) /\
   !cmp lb l x r.
     bt_to_ol_lb cmp lb (node l x r) =
     if apto cmp lb x = LESS then
       bt_to_ol_lb_ub cmp lb l x ++ [x] ++ bt_to_ol_lb cmp x r
     else bt_to_ol_lb cmp lb r
|- (!cmp lb m. bt_to_ol_lb_ac cmp lb nt m = m) /\
   !cmp lb l x r m.
     bt_to_ol_lb_ac cmp lb (node l x r) m =
     if apto cmp lb x = LESS then
       bt_to_ol_lb_ub_ac cmp lb l x (x::bt_to_ol_lb_ac cmp x r m)
     else bt_to_ol_lb_ac cmp lb r m
|- (!cmp lb ub. bt_to_ol_lb_ub cmp lb nt ub = []) /\
   !cmp lb l x r ub.
     bt_to_ol_lb_ub cmp lb (node l x r) ub =
     if apto cmp lb x = LESS then
       if apto cmp x ub = LESS then
         bt_to_ol_lb_ub cmp lb l x ++ [x] ++ bt_to_ol_lb_ub cmp x r ub
       else bt_to_ol_lb_ub cmp lb l ub
     else bt_to_ol_lb_ub cmp lb r ub
|- (!cmp lb ub m. bt_to_ol_lb_ub_ac cmp lb nt ub m = m) /\
   !cmp lb l x r ub m.
     bt_to_ol_lb_ub_ac cmp lb (node l x r) ub m =
     if apto cmp lb x = LESS then
       if apto cmp x ub = LESS then
         bt_to_ol_lb_ub_ac cmp lb l x (x::bt_to_ol_lb_ub_ac cmp x r ub m)
       else bt_to_ol_lb_ub_ac cmp lb l ub m
     else bt_to_ol_lb_ub_ac cmp lb r ub m
|- (!cmp ub. bt_to_ol_ub cmp nt ub = []) /\
   !cmp l x r ub.
     bt_to_ol_ub cmp (node l x r) ub =
     if apto cmp x ub = LESS then
       bt_to_ol_ub cmp l x ++ [x] ++ bt_to_ol_lb_ub cmp x r ub
     else bt_to_ol_ub cmp l ub
|- (!cmp ub m. bt_to_ol_ub_ac cmp nt ub m = m) /\
   !cmp l x r ub m.
     bt_to_ol_ub_ac cmp (node l x r) ub m =
     if apto cmp x ub = LESS then
       bt_to_ol_ub_ac cmp l x (x::bt_to_ol_lb_ub_ac cmp x r ub m)
     else bt_to_ol_ub_ac cmp l ub m
|- (!cmp. ENUMERAL cmp nt = {}) /\
   !cmp l x r.
     ENUMERAL cmp (node l x r) =
     {y | y IN ENUMERAL cmp l /\ (apto cmp y x = LESS)} UNION {x} UNION
     {z | z IN ENUMERAL cmp r /\ (apto cmp x z = LESS)}
|- !cmp lb t.
     bt_to_set_lb cmp lb t =
     {x | x IN ENUMERAL cmp t /\ (apto cmp lb x = LESS)}
|- !cmp lb t ub.
     bt_to_set_lb_ub cmp lb t ub =
     {x |
      x IN ENUMERAL cmp t /\ (apto cmp lb x = LESS) /\
      (apto cmp x ub = LESS)}
|- !cmp t ub.
     bt_to_set_ub cmp t ub =
     {x | x IN ENUMERAL cmp t /\ (apto cmp x ub = LESS)}
|- (!cmp. incr_sbuild cmp [] = []) /\
   !cmp x l.
     incr_sbuild cmp (x::l) = incr_smerge cmp [x] (incr_sbuild cmp l)
|- !cmp l. incr_ssort cmp l = smerge_out cmp [] (incr_sbuild cmp l)
|- (list_to_bl [] = nbl) /\
   !a l. list_to_bl (a::l) = BL_CONS a (list_to_bl l)
|- !l. list_to_bt l = bl_to_bt (list_to_bl l)
lol_set_primitive
|- lol_set =
   WFREC
     (@R. WF R /\ (!lol. R lol (NONE::lol)) /\ !m lol. R lol (SOME m::lol))
     (\lol_set a.
        case a of
          [] => I {}
        | NONE::lol => I (lol_set lol)
        | SOME m::lol => I (set m UNION lol_set lol))

Theorems

|- (T /\ T <=> T) /\ (T /\ F <=> F) /\ (F /\ T <=> F) /\ (F /\ F <=> F)
|- !cmp sl. OU cmp {} sl = sl
|- !cmp l. set l = ENUMERAL cmp (list_to_bt (incr_ssort cmp l))
|- (EQUAL = LESS) <=> F
|- !v0 v1. (if EQUAL = LESS then v0 else v1) = v1
|- !v0 v1. (if GREATER = LESS then v0 else v1) = v1
|- !v0 v1. (if LESS = LESS then v0 else v1) = v0
|- (GREATER = LESS) <=> F
|- (!cmp y. y IN ENUMERAL cmp nt <=> F) /\
   !cmp l x r y.
     y IN ENUMERAL cmp (node l x r) <=>
     y IN ENUMERAL cmp l /\ (apto cmp y x = LESS) \/ (y = x) \/
     y IN ENUMERAL cmp r /\ (apto cmp x y = LESS)
|- !cmp x l y r.
     x IN ENUMERAL cmp (node l y r) <=>
     case apto cmp x y of
       LESS => x IN ENUMERAL cmp l
     | EQUAL => T
     | GREATER => x IN ENUMERAL cmp r
|- !cmp x u v.
     LESS_ALL cmp x (OU cmp u v) <=> LESS_ALL cmp x u /\ LESS_ALL cmp x v
|- !cmp a s t.
     LESS_ALL cmp a s /\ LESS_ALL cmp a t ==>
     (OU cmp (UO cmp {a} s) t = a INSERT OU cmp s t)
|- !cmp a s. LESS_ALL cmp a s ==> (UO cmp {a} s = a INSERT s)
|- !cmp x y s.
     (!z. z IN UO cmp {x} s ==> (apto cmp y z = LESS)) <=>
     (apto cmp y x = LESS)
|- !a l s. (s = set l) ==> (a INSERT s = set (a::l))
|- {} = set []
|- !cmp y. y IN ENUMERAL cmp nt <=> F
|- !cmp l.
     OL cmp l ==>
     !m. OL cmp m ==>
         OL cmp (sdiff cmp l m) /\ (set (sdiff cmp l m) = set l DIFF set m)
|- !cmp l. OL cmp l ==> (set l = ENUMERAL cmp (list_to_bt l))
|- !cmp l.
     OL cmp l ==>
     !m. OL cmp m ==>
         OL cmp (sinter cmp l m) /\
         (set (sinter cmp l m) = set l INTER set m)
|- !cmp l.
     OL cmp l ==>
     !m. OL cmp m ==>
         OL cmp (smerge cmp l m) /\
         (set (smerge cmp l m) = set l UNION set m)
|- !cmp t. OL cmp (bt_to_ol cmp t)
|- !cmp t lb. OL cmp (bt_to_ol_lb cmp lb t)
|- !cmp t lb ub. OL cmp (bt_to_ol_lb_ub cmp lb t ub)
|- !cmp t ub. OL cmp (bt_to_ol_ub cmp t ub)
|- (!cmp. OL_sublists cmp [] <=> T) /\
   (!lol cmp. OL_sublists cmp (NONE::lol) <=> OL_sublists cmp lol) /\
   !m lol cmp.
     OL_sublists cmp (SOME m::lol) <=> OL cmp m /\ OL_sublists cmp lol
|- !P. (!cmp. P cmp []) /\ (!cmp lol. P cmp lol ==> P cmp (NONE::lol)) /\
       (!cmp m lol. P cmp lol ==> P cmp (SOME m::lol)) ==>
       !v v1. P v v1
|- !cmp a b c. OU cmp a (OU cmp b c) = OU cmp (OU cmp a b) c
|- !cmp t. OU cmp t {} = t
|- !cmp s l t m.
     OWL cmp s l /\ OWL cmp t m ==> OWL cmp (s DIFF t) (sdiff cmp l m)
|- !cmp s l t m.
     OWL cmp s l /\ OWL cmp t m ==> OWL cmp (s INTER t) (sinter cmp l m)
|- !cmp s l t m.
     OWL cmp s l /\ OWL cmp t m ==> OWL cmp (s UNION t) (smerge cmp l m)
|- !cmp t. OWL cmp (ENUMERAL cmp t) (bt_to_ol cmp t)
|- !cmp t.
     bt_to_ol cmp t =
     if OL_bt cmp t then bt_to_list_ac t [] else bt_to_ol_ac cmp t []
blMAP_ind
|- !P'.
     (!f. P' f nbl /\ (!b. P' f b ==> P' f (zerbl b)) /\
          !b. P' f b ==> !b0 a. P' f (onebl a b0 b)) ==>
     !f b. P' f b
blMAP_thm
|- (blMAP f nbl = nbl) /\ (blMAP f (zerbl a0) = zerbl (blMAP f a0)) /\
   (blMAP f (onebl a0 a1 a2) = onebl (f a0) (btMAP f a1) (blMAP f a2))
blSET_ind
|- !P'.
     P' nbl /\ (!b. P' b ==> P' (zerbl b)) /\
     (!b. P' b ==> !b0 a. P' (onebl a b0 b)) ==>
     !b. P' b
blSET_thm
|- (blSET nbl = {}) /\ (blSET (zerbl a0) = blSET a0) /\
   (blSET (onebl a0 a1 a2) = a0 INSERT btSET a1 UNION blSET a2)
bl_11
|- (!a0 a0'. (zerbl a0 = zerbl a0') <=> (a0 = a0')) /\
   !a0 a1 a2 a0' a1' a2'.
     (onebl a0 a1 a2 = onebl a0' a1' a2') <=>
     (a0 = a0') /\ (a1 = a1') /\ (a2 = a2')
bl_Axiom
|- !f0 f1 f2. ?h.
     (h nbl = f0) /\ (!a0. h (zerbl a0) = f1 a0 (h a0)) /\
     !a0 a1 a2. h (onebl a0 a1 a2) = f2 a0 a1 a2 (h a2)
bl_MAP_CONG
|- !f g x. (!a. a IN blSET x ==> (f a = g a)) ==> (blMAP f x = blMAP g x)
bl_MAP_ID
|- blMAP I = I
bl_MAP_IMAGE
|- !f n. blSET (blMAP f n) = IMAGE f (blSET n)
bl_MAP_O
|- blMAP f o blMAP g = blMAP (f o g)
bl_bnd
|- !n. cardleq (blSET n) univ(:num)
bl_case_cong
|- !M M' v f f0.
     (M = M') /\ ((M' = nbl) ==> (v = v')) /\
     (!a0. (M' = zerbl a0) ==> (f a0 = f' a0)) /\
     (!a0 a1 a2. (M' = onebl a0 a1 a2) ==> (f0 a0 a1 a2 = f0' a0 a1 a2)) ==>
     (bl_CASE M v f f0 = bl_CASE M' v' f' f0')
bl_case_eq
|- (bl_CASE x v f f0 = v') <=>
   (x = nbl) /\ (v = v') \/ (?b. (x = zerbl b) /\ (f b = v')) \/
   ?a b0 b. (x = onebl a b0 b) /\ (f0 a b0 b = v')
bl_distinct
|- (!a0. nbl <> zerbl a0) /\ (!a2 a1 a0. nbl <> onebl a0 a1 a2) /\
   !a2 a1 a0' a0. zerbl a0 <> onebl a0' a1 a2
bl_induction
|- !P. P nbl /\ (!b. P b ==> P (zerbl b)) /\
       (!b. P b ==> !b0 a. P (onebl a b0 b)) ==>
       !b. P b
bl_inh
|- !a2. a2 IN blSET ((\a2. bl_CONS (INR (INR (flip $, ARB a2)))) a2)
bl_nchotomy
|- !bb. (bb = nbl) \/ (?b. bb = zerbl b) \/ ?a b0 b. bb = onebl a b0 b
bl_wit
|- !a. blSET ((\a. bl_CONS ((K o INL) ARB ARB)) a) SUBSET {}
btMAP_ind
|- !P'.
     (!f. P' f nt /\ !b b0. P' f b /\ P' f b0 ==> !a. P' f (node b a b0)) ==>
     !f b. P' f b
btMAP_thm
|- (btMAP f nt = nt) /\
   (btMAP f (node a0 a1 a2) = node (btMAP f a0) (f a1) (btMAP f a2))
btSET_ind
|- !P'.
     P' nt /\ (!b b0. P' b /\ P' b0 ==> !a. P' (node b a b0)) ==> !b. P' b
btSET_thm
|- (btSET nt = {}) /\
   (btSET (node a0 a1 a2) = a1 INSERT btSET a0 UNION btSET a2)
bt_11
|- !a0 a1 a2 a0' a1' a2'.
     (node a0 a1 a2 = node a0' a1' a2') <=>
     (a0 = a0') /\ (a1 = a1') /\ (a2 = a2')
bt_Axiom
|- !f0 f1. ?h.
     (h nt = f0) /\
     !a0 a1 a2. h (node a0 a1 a2) = f1 a1 a0 a2 (h a0) (h a2)
bt_MAP_CONG
|- !f g x. (!a. a IN btSET x ==> (f a = g a)) ==> (btMAP f x = btMAP g x)
bt_MAP_ID
|- btMAP I = I
bt_MAP_IMAGE
|- !f n. btSET (btMAP f n) = IMAGE f (btSET n)
bt_MAP_O
|- btMAP f o btMAP g = btMAP (f o g)
bt_bnd
|- !n. cardleq (btSET n) univ(:num)
bt_case_cong
|- !M M' v f.
     (M = M') /\ ((M' = nt) ==> (v = v')) /\
     (!a0 a1 a2. (M' = node a0 a1 a2) ==> (f a0 a1 a2 = f' a0 a1 a2)) ==>
     (bt_CASE M v f = bt_CASE M' v' f')
bt_case_eq
|- (bt_CASE x v f = v') <=>
   (x = nt) /\ (v = v') \/ ?b a b0. (x = node b a b0) /\ (f b a b0 = v')
bt_distinct
|- !a2 a1 a0. nt <> node a0 a1 a2
bt_induction
|- !P. P nt /\ (!b b0. P b /\ P b0 ==> !a. P (node b a b0)) ==> !b. P b
bt_inh
|- !a2. a2 IN btSET ((\a2. bt_CONS (INR (ARB,flip $, ARB a2))) a2)
bt_nchotomy
|- !bb. (bb = nt) \/ ?b a b0. bb = node b a b0
|- !t. bt_to_list t = bt_to_list_ac t []
|- !cmp l. OL cmp l ==> (bt_to_ol cmp (list_to_bt l) = l)
bt_wit
|- !a. btSET ((\a. bt_CONS ((K o INL) ARB ARB)) a) SUBSET {}
datatype_bl
|- DATATYPE (bl nbl zerbl onebl)
datatype_bt
|- DATATYPE (bt nt node)
|- (!l cmp. incr_smerge cmp l [] = [SOME l]) /\
   (!lol l cmp. incr_smerge cmp l (NONE::lol) = SOME l::lol) /\
   !m lol l cmp.
     incr_smerge cmp l (SOME m::lol) =
     NONE::incr_smerge cmp (smerge cmp l m) lol
|- !cmp lol l.
     OL_sublists cmp lol /\ OL cmp l ==>
     OL_sublists cmp (incr_smerge cmp l lol)
|- !P. (!cmp l. P cmp l []) /\ (!cmp l lol. P cmp l (NONE::lol)) /\
       (!cmp l m lol. P cmp (smerge cmp l m) lol ==> P cmp l (SOME m::lol)) ==>
       !v v1 v2. P v v1 v2
|- (lol_set [] = {}) /\ (!lol. lol_set (NONE::lol) = lol_set lol) /\
   !m lol. lol_set (SOME m::lol) = set m UNION lol_set lol
|- !P. P [] /\ (!lol. P lol ==> P (NONE::lol)) /\
       (!m lol. P lol ==> P (SOME m::lol)) ==>
       !v. P v
|- !cmp t. ENUMERAL cmp t = set (bt_to_ol cmp t)
|- (!cmp. sdiff cmp [] [] = []) /\
   (!x l cmp. sdiff cmp (x::l) [] = x::l) /\
   (!y m cmp. sdiff cmp [] (y::m) = []) /\
   !y x m l cmp.
     sdiff cmp (x::l) (y::m) =
     case apto cmp x y of
       LESS => x::sdiff cmp l (y::m)
     | EQUAL => sdiff cmp l m
     | GREATER => sdiff cmp (x::l) m
|- !P. (!cmp. P cmp [] []) /\ (!cmp x l. P cmp (x::l) []) /\
       (!cmp y m. P cmp [] (y::m)) /\
       (!cmp x l y m.
          ((apto cmp x y = EQUAL) ==> P cmp l m) /\
          ((apto cmp x y = GREATER) ==> P cmp (x::l) m) /\
          ((apto cmp x y = LESS) ==> P cmp l (y::m)) ==>
          P cmp (x::l) (y::m)) ==>
       !v v1 v2. P v v1 v2
|- !cmp l. OWL cmp (set l) (incr_ssort cmp l)
|- (!cmp. sinter cmp [] [] = []) /\
   (!x l cmp. sinter cmp (x::l) [] = []) /\
   (!y m cmp. sinter cmp [] (y::m) = []) /\
   !y x m l cmp.
     sinter cmp (x::l) (y::m) =
     case apto cmp x y of
       LESS => sinter cmp l (y::m)
     | EQUAL => x::sinter cmp l m
     | GREATER => sinter cmp (x::l) m
|- !P. (!cmp. P cmp [] []) /\ (!cmp x l. P cmp (x::l) []) /\
       (!cmp y m. P cmp [] (y::m)) /\
       (!cmp x l y m.
          ((apto cmp x y = EQUAL) ==> P cmp l m) /\
          ((apto cmp x y = GREATER) ==> P cmp (x::l) m) /\
          ((apto cmp x y = LESS) ==> P cmp l (y::m)) ==>
          P cmp (x::l) (y::m)) ==>
       !v v1 v2. P v v1 v2
|- (!cmp. smerge cmp [] [] = []) /\
   (!x l cmp. smerge cmp (x::l) [] = x::l) /\
   (!y m cmp. smerge cmp [] (y::m) = y::m) /\
   !y x m l cmp.
     smerge cmp (x::l) (y::m) =
     case apto cmp x y of
       LESS => x::smerge cmp l (y::m)
     | EQUAL => x::smerge cmp l m
     | GREATER => y::smerge cmp (x::l) m
|- !cmp l m. OL cmp l /\ OL cmp m ==> OL cmp (smerge cmp l m)
|- !P. (!cmp. P cmp [] []) /\ (!cmp x l. P cmp (x::l) []) /\
       (!cmp y m. P cmp [] (y::m)) /\
       (!cmp x l y m.
          ((apto cmp x y = EQUAL) ==> P cmp l m) /\
          ((apto cmp x y = GREATER) ==> P cmp (x::l) m) /\
          ((apto cmp x y = LESS) ==> P cmp l (y::m)) ==>
          P cmp (x::l) (y::m)) ==>
       !v v1 v2. P v v1 v2
|- !cmp l. (smerge cmp l [] = l) /\ (smerge cmp [] l = l)
|- (!l cmp. smerge_out cmp l [] = l) /\
   (!lol l cmp. smerge_out cmp l (NONE::lol) = smerge_out cmp l lol) /\
   !m lol l cmp.
     smerge_out cmp l (SOME m::lol) = smerge_out cmp (smerge cmp l m) lol
|- !P. (!cmp l. P cmp l []) /\
       (!cmp l lol. P cmp l lol ==> P cmp l (NONE::lol)) /\
       (!cmp l m lol. P cmp (smerge cmp l m) lol ==> P cmp l (SOME m::lol)) ==>
       !v v1 v2. P v v1 v2