Theory "list"

Parents     pred_set   operator   ind_type

Signature

Type Arity
list 1
Constant Type
ALL_DISTINCT :α list -> bool
APPEND :α list -> α list -> α list
CONS :α -> α list -> α list
DROP :num -> α list -> α list
EL :num -> α list -> α
EVERY :(α -> bool) -> α list -> bool
EVERYi :(num -> α -> bool) -> α list -> bool
EXISTS :(α -> bool) -> α list -> bool
FILTER :(α -> bool) -> α list -> α list
FIND :(α -> bool) -> α list -> α option
FLAT :α list list -> α list
FOLDL :(β -> α -> β) -> β -> α list -> β
FOLDL2 :(α -> β -> γ -> α) -> α -> β list -> γ list -> α
FOLDR :(α -> β -> β) -> β -> α list -> β
FRONT :α list -> α list
GENLIST :(num -> α) -> num -> α list
GENLIST_AUX :(num -> α) -> num -> α list -> α list
HD :α list -> α
INDEX_FIND :num -> (α -> bool) -> α list -> (num # α) option
INDEX_OF :α -> α list -> num option
LAST :α list -> α
LEN :α list -> num -> num
LENGTH :α list -> num
LIST_APPLY :(β -> α) list -> β list -> α list
LIST_BIND :β list -> (β -> α list) -> α list
LIST_IGNORE_BIND :β list -> α list -> α list
LIST_LIFT2 :(β -> γ -> α) -> β list -> γ list -> α list
LIST_REL :(α -> β -> bool) -> α list -> β list -> bool
LIST_TO_SET :α list -> α -> bool
LLEX :α reln -> α list reln
LRC :α reln -> α list -> α reln
LUPDATE :α -> num -> α list -> α list
MAP :(α -> β) -> α list -> β list
MAP2 :(β -> γ -> α) -> β list -> γ list -> α list
NIL :α list
NULL :α list -> bool
PAD_LEFT :α -> num -> α list -> α list
PAD_RIGHT :α -> num -> α list -> α list
REV :α list -> α list -> α list
REVERSE :α list -> α list
SET_TO_LIST :(α -> bool) -> α list
SNOC :α -> α list -> α list
SUM :num list -> num
SUM_ACC :num list -> num -> num
TAKE :num -> α list -> α list
TL :α list -> α list
UNZIP :(α, β) alist -> α list # β list
ZIP :α list # β list -> (α, β) alist
dropWhile :(α -> bool) -> α list -> α list
isPREFIX :α list reln
list_CASE :α list -> β -> (α -> α list -> β) -> β
list_size :(α -> num) -> α list -> num
nub :α list -> α list
splitAtPki :(num -> β -> bool) -> (β list -> β list -> α) -> β list -> α

Definitions

SUM_ACC_DEF
|- (∀acc. SUM_ACC [] acc = acc) ∧
   ∀h t acc. SUM_ACC (h::t) acc = SUM_ACC t (h + acc)
REV_DEF
|- (∀acc. REV [] acc = acc) ∧ ∀h t acc. REV (h::t) acc = REV t (h::acc)
LEN_DEF
|- (∀n. LEN [] n = n) ∧ ∀h t n. LEN (h::t) n = LEN t (n + 1)
PAD_RIGHT
|- ∀c n s. PAD_RIGHT c n s = s ++ GENLIST (K c) (n − LENGTH s)
PAD_LEFT
|- ∀c n s. PAD_LEFT c n s = GENLIST (K c) (n − LENGTH s) ++ s
GENLIST_AUX
|- (∀f l. GENLIST_AUX f 0 l = l) ∧
   ∀f n l. GENLIST_AUX f (SUC n) l = GENLIST_AUX f n (f n::l)
GENLIST
|- (∀f. GENLIST f 0 = []) ∧ ∀f n. GENLIST f (SUC n) = SNOC (f n) (GENLIST f n)
SNOC
|- (∀x. SNOC x [] = [x]) ∧ ∀x x' l. SNOC x (x'::l) = x'::SNOC x l
isPREFIX
|- (∀l. [] ≼ l ⇔ T) ∧
   ∀h t l. h::t ≼ l ⇔ case l of [] => F | h'::t' => (h = h') ∧ t ≼ t'
SET_TO_LIST_primitive
|- SET_TO_LIST =
   WFREC (@R. WF R ∧ ∀s. FINITE s ∧ s ≠ ∅ ⇒ R (REST s) s)
     (λSET_TO_LIST s.
        I
          (if FINITE s then
             if s = ∅ then [] else CHOICE s::SET_TO_LIST (REST s)
           else ARB))
LRC_def
|- (∀R x y. LRC R [] x y ⇔ (x = y)) ∧
   ∀R h t x y. LRC R (h::t) x y ⇔ (x = h) ∧ ∃z. R x z ∧ LRC R t z y
ALL_DISTINCT
|- (ALL_DISTINCT [] ⇔ T) ∧
   ∀h t. ALL_DISTINCT (h::t) ⇔ ¬MEM h t ∧ ALL_DISTINCT t
DROP_def
|- (∀n. DROP n [] = []) ∧
   ∀n x xs. DROP n (x::xs) = if n = 0 then x::xs else DROP (n − 1) xs
TAKE_def
|- (∀n. TAKE n [] = []) ∧
   ∀n x xs. TAKE n (x::xs) = if n = 0 then [] else x::TAKE (n − 1) xs
FRONT_DEF
|- ∀h t. FRONT (h::t) = if t = [] then [] else h::FRONT t
LAST_DEF
|- ∀h t. LAST (h::t) = if t = [] then h else LAST t
REVERSE_DEF
|- (REVERSE [] = []) ∧ ∀h t. REVERSE (h::t) = REVERSE t ++ [h]
UNZIP
|- (UNZIP [] = ([],[])) ∧
   ∀x l. UNZIP (x::l) = (FST x::FST (UNZIP l),SND x::SND (UNZIP l))
ZIP
|- (ZIP ([],[]) = []) ∧
   ∀x1 l1 x2 l2. ZIP (x1::l1,x2::l2) = (x1,x2)::ZIP (l1,l2)
list_size_def
|- (∀f. list_size f [] = 0) ∧
   ∀f a0 a1. list_size f (a0::a1) = 1 + (f a0 + list_size f a1)
list_case_def
|- (∀v f. list_CASE [] v f = v) ∧ ∀a0 a1 v f. list_CASE (a0::a1) v f = f a0 a1
list_TY_DEF
|- ∃rep.
     TYPE_DEFINITION
       (λa0'.
          ∀'list' .
            (∀a0'.
               (a0' = ind_type$CONSTR 0 ARB (λn. ind_type$BOTTOM)) ∨
               (∃a0 a1.
                  (a0' =
                   (λa0 a1.
                      ind_type$CONSTR (SUC 0) a0
                        (ind_type$FCONS a1 (λn. ind_type$BOTTOM))) a0 a1) ∧
                  'list' a1) ⇒
               'list' a0') ⇒
            'list' a0') rep
NULL_DEF
|- (NULL [] ⇔ T) ∧ ∀h t. NULL (h::t) ⇔ F
HD
|- ∀h t. HD (h::t) = h
TL
|- ∀h t. TL (h::t) = t
SUM
|- (SUM [] = 0) ∧ ∀h t. SUM (h::t) = h + SUM t
APPEND
|- (∀l. [] ++ l = l) ∧ ∀l1 l2 h. h::l1 ++ l2 = h::(l1 ++ l2)
FLAT
|- (FLAT [] = []) ∧ ∀h t. FLAT (h::t) = h ++ FLAT t
LENGTH
|- (LENGTH [] = 0) ∧ ∀h t. LENGTH (h::t) = SUC (LENGTH t)
MAP
|- (∀f. MAP f [] = []) ∧ ∀f h t. MAP f (h::t) = f h::MAP f t
LIST_TO_SET_DEF
|- (∀x. LIST_TO_SET [] x ⇔ F) ∧
   ∀h t x. LIST_TO_SET (h::t) x ⇔ (x = h) ∨ LIST_TO_SET t x
FILTER
|- (∀P. FILTER P [] = []) ∧
   ∀P h t. FILTER P (h::t) = if P h then h::FILTER P t else FILTER P t
FOLDR
|- (∀f e. FOLDR f e [] = e) ∧ ∀f e x l. FOLDR f e (x::l) = f x (FOLDR f e l)
FOLDL
|- (∀f e. FOLDL f e [] = e) ∧ ∀f e x l. FOLDL f e (x::l) = FOLDL f (f e x) l
EVERY_DEF
|- (∀P. EVERY P [] ⇔ T) ∧ ∀P h t. EVERY P (h::t) ⇔ P h ∧ EVERY P t
EXISTS_DEF
|- (∀P. EXISTS P [] ⇔ F) ∧ ∀P h t. EXISTS P (h::t) ⇔ P h ∨ EXISTS P t
EL
|- (∀l. EL 0 l = HD l) ∧ ∀l n. EL (SUC n) l = EL n (TL l)
INDEX_FIND_def
|- (∀i P. INDEX_FIND i P [] = NONE) ∧
   ∀i P h t.
     INDEX_FIND i P (h::t) =
     if P h then SOME (i,h) else INDEX_FIND (SUC i) P t
FIND_def
|- ∀P. FIND P = OPTION_MAP SND o INDEX_FIND 0 P
INDEX_OF_def
|- ∀x. INDEX_OF x = OPTION_MAP FST o INDEX_FIND 0 ($= x)
LUPDATE_def
|- (∀e n. LUPDATE e n [] = []) ∧ (∀e x l. LUPDATE e 0 (x::l) = e::l) ∧
   ∀e n x l. LUPDATE e (SUC n) (x::l) = x::LUPDATE e n l
EVERYi_DEF
|- (∀P. EVERYi P [] ⇔ T) ∧
   ∀P h t. EVERYi P (h::t) ⇔ P 0 h ∧ EVERYi (P o SUC) t
splitAtPki_DEF
|- (∀P k. splitAtPki P k [] = k [] []) ∧
   ∀P k h t.
     splitAtPki P k (h::t) =
     if P 0 h then k [] (h::t) else splitAtPki (P o SUC) (λp s. k (h::p) s) t
LIST_BIND_DEF
|- ∀l f. LIST_BIND l f = FLAT (MAP f l)
LIST_IGNORE_BIND_DEF
|- ∀m1 m2. LIST_IGNORE_BIND m1 m2 = LIST_BIND m1 (K m2)
LIST_APPLY_DEF
|- ∀fs xs. fs <*> xs = LIST_BIND fs (combin$C MAP xs)
LIST_LIFT2_DEF
|- ∀f xs ys. LIST_LIFT2 f xs ys = MAP f xs <*> ys
LLEX_DEF
|- (∀R l2. LLEX R [] l2 ⇔ l2 ≠ []) ∧
   ∀R h1 t1 l2.
     LLEX R (h1::t1) l2 ⇔
     case l2 of
       [] => F
     | h2::t2 => if R h1 h2 then T else if h1 = h2 then LLEX R t1 t2 else F
nub_def
|- (nub [] = []) ∧ ∀x l. nub (x::l) = if MEM x l then nub l else x::nub l
dropWhile_def
|- (∀P. dropWhile P [] = []) ∧
   ∀P h t. dropWhile P (h::t) = if P h then dropWhile P t else h::t


Theorems

EXISTS_LIST
|- (∃l. P l) ⇔ P [] ∨ ∃h t. P (h::t)
SUM_SUM_ACC
|- ∀L. SUM L = SUM_ACC L 0
SUM_ACC_SUM_LEM
|- ∀L n. SUM_ACC L n = SUM L + n
REVERSE_REV
|- ∀L. REVERSE L = REV L []
LENGTH_LEN
|- ∀L. LENGTH L = LEN L 0
REV_REVERSE_LEM
|- ∀L1 L2. REV L1 L2 = REVERSE L1 ++ L2
LEN_LENGTH_LEM
|- ∀L n. LEN L n = LENGTH L + n
INFINITE_LIST_UNIV
|- INFINITE 𝕌(:α list)
MAP_ZIP_SAME
|- ∀ls f. MAP f (ZIP (ls,ls)) = MAP (λx. f (x,x)) ls
FOLDL_ZIP_SAME
|- ∀ls f e. FOLDL f e (ZIP (ls,ls)) = FOLDL (λx y. f x (y,y)) e ls
FOLDL_UNION_BIGUNION_paired
|- ∀f ls s.
     FOLDL (λs (x,y). s ∪ f x y) s ls =
     s ∪ BIGUNION (IMAGE (UNCURRY f) (LIST_TO_SET ls))
FOLDL_UNION_BIGUNION
|- ∀f ls s.
     FOLDL (λs x. s ∪ f x) s ls = s ∪ BIGUNION (IMAGE f (LIST_TO_SET ls))
REVERSE_GENLIST
|- REVERSE (GENLIST f n) = GENLIST (λm. f (PRE n − m)) n
EL_REVERSE
|- ∀n l. n < LENGTH l ⇒ (EL n (REVERSE l) = EL (PRE (LENGTH l − n)) l)
SUM_IMAGE_eq_SUM_MAP_SET_TO_LIST
|- FINITE s ⇒ (∑ f s = SUM (MAP f (SET_TO_LIST s)))
SUM_MAP_FOLDL
|- ∀ls. SUM (MAP f ls) = FOLDL (λa e. a + f e) 0 ls
SUM_APPEND
|- ∀l1 l2. SUM (l1 ++ l2) = SUM l1 + SUM l2
SUM_SNOC
|- ∀x l. SUM (SNOC x l) = SUM l + x
FOLDL_SNOC
|- ∀f e x l. FOLDL f e (SNOC x l) = f (FOLDL f e l) x
ALL_DISTINCT_GENLIST
|- ALL_DISTINCT (GENLIST f n) ⇔
   ∀m1 m2. m1 < n ∧ m2 < n ∧ (f m1 = f m2) ⇒ (m1 = m2)
ALL_DISTINCT_SNOC
|- ∀x l. ALL_DISTINCT (SNOC x l) ⇔ ¬MEM x l ∧ ALL_DISTINCT l
MEM_GENLIST
|- MEM x (GENLIST f n) ⇔ ∃m. m < n ∧ (x = f m)
GENLIST_NUMERALS
|- (GENLIST f 0 = []) ∧ (GENLIST f (NUMERAL n) = GENLIST_AUX f (NUMERAL n) [])
GENLIST_GENLIST_AUX
|- ∀n. GENLIST f n = GENLIST_AUX f n []
NULL_GENLIST
|- ∀n f. NULL (GENLIST f n) ⇔ (n = 0)
GENLIST_CONS
|- GENLIST f (SUC n) = f 0::GENLIST (f o SUC) n
ZIP_GENLIST
|- ∀l f n.
     (LENGTH l = n) ⇒ (ZIP (l,GENLIST f n) = GENLIST (λx. (EL x l,f x)) n)
TL_GENLIST
|- ∀f n. TL (GENLIST f (SUC n)) = GENLIST (f o SUC) n
EXISTS_GENLIST
|- ∀n. EXISTS P (GENLIST f n) ⇔ ∃i. i < n ∧ P (f i)
EVERY_GENLIST
|- ∀n. EVERY P (GENLIST f n) ⇔ ∀i. i < n ⇒ P (f i)
GENLIST_APPEND
|- ∀f a b. GENLIST f (a + b) = GENLIST f b ++ GENLIST (λt. f (t + b)) a
GENLIST_FUN_EQ
|- ∀n f g. (GENLIST f n = GENLIST g n) ⇔ ∀x. x < n ⇒ (f x = g x)
HD_GENLIST_COR
|- ∀n f. 0 < n ⇒ (HD (GENLIST f n) = f 0)
HD_GENLIST
|- HD (GENLIST f (SUC n)) = f 0
EL_GENLIST
|- ∀f n x. x < n ⇒ (EL x (GENLIST f n) = f x)
MAP_GENLIST
|- ∀f g n. MAP f (GENLIST g n) = GENLIST (f o g) n
GENLIST_AUX_compute
|- (∀f l. GENLIST_AUX f 0 l = l) ∧
   (∀f n l.
      GENLIST_AUX f (NUMERAL (BIT1 n)) l =
      GENLIST_AUX f (NUMERAL (BIT1 n) − 1) (f (NUMERAL (BIT1 n) − 1)::l)) ∧
   ∀f n l.
     GENLIST_AUX f (NUMERAL (BIT2 n)) l =
     GENLIST_AUX f (NUMERAL (BIT1 n)) (f (NUMERAL (BIT1 n))::l)
LENGTH_GENLIST
|- ∀f n. LENGTH (GENLIST f n) = n
SNOC_CASES
|- ∀ll. (ll = []) ∨ ∃x l. ll = SNOC x l
SNOC_INDUCT
|- ∀P. P [] ∧ (∀l. P l ⇒ ∀x. P (SNOC x l)) ⇒ ∀l. P l
SNOC_Axiom
|- ∀e f. ∃fn. (fn [] = e) ∧ ∀x l. fn (SNOC x l) = f x l (fn l)
REVERSE_SNOC
|- ∀x l. REVERSE (SNOC x l) = x::REVERSE l
REVERSE_SNOC_DEF
|- (REVERSE [] = []) ∧ ∀x l. REVERSE (x::l) = SNOC x (REVERSE l)
SNOC_11
|- ∀x y a b. (SNOC x y = SNOC a b) ⇔ (x = a) ∧ (y = b)
MEM_SNOC
|- ∀y x l. MEM y (SNOC x l) ⇔ (y = x) ∨ MEM y l
EXISTS_SNOC
|- ∀P x l. EXISTS P (SNOC x l) ⇔ P x ∨ EXISTS P l
EVERY_SNOC
|- ∀P x l. EVERY P (SNOC x l) ⇔ EVERY P l ∧ P x
APPEND_SNOC
|- ∀l1 x l2. l1 ++ SNOC x l2 = SNOC x (l1 ++ l2)
EL_LENGTH_SNOC
|- ∀l x. EL (LENGTH l) (SNOC x l) = x
EL_SNOC
|- ∀n l. n < LENGTH l ⇒ ∀x. EL n (SNOC x l) = EL n l
MAP_SNOC
|- ∀f x l. MAP f (SNOC x l) = SNOC (f x) (MAP f l)
LIST_TO_SET_SNOC
|- LIST_TO_SET (SNOC x ls) = x INSERT LIST_TO_SET ls
SNOC_APPEND
|- ∀x l. SNOC x l = l ++ [x]
FRONT_SNOC
|- ∀x l. FRONT (SNOC x l) = l
LAST_SNOC
|- ∀x l. LAST (SNOC x l) = x
LENGTH_SNOC
|- ∀x l. LENGTH (SNOC x l) = SUC (LENGTH l)
isPREFIX_THM
|- ([] ≼ l ⇔ T) ∧ (h::t ≼ [] ⇔ F) ∧ (h1::t1 ≼ h2::t2 ⇔ (h1 = h2) ∧ t1 ≼ t2)
ITSET_eq_FOLDL_SET_TO_LIST
|- ∀s. FINITE s ⇒ ∀f a. ITSET f s a = FOLDL (combin$C f) a (SET_TO_LIST s)
ALL_DISTINCT_SET_TO_LIST
|- ∀s. FINITE s ⇒ ALL_DISTINCT (SET_TO_LIST s)
SET_TO_LIST_SING
|- SET_TO_LIST {x} = [x]
MEM_SET_TO_LIST
|- ∀s. FINITE s ⇒ ∀x. MEM x (SET_TO_LIST s) ⇔ x ∈ s
SET_TO_LIST_IN_MEM
|- ∀s. FINITE s ⇒ ∀x. x ∈ s ⇔ MEM x (SET_TO_LIST s)
SET_TO_LIST_CARD
|- ∀s. FINITE s ⇒ (LENGTH (SET_TO_LIST s) = CARD s)
SET_TO_LIST_INV
|- ∀s. FINITE s ⇒ (LIST_TO_SET (SET_TO_LIST s) = s)
SET_TO_LIST_EMPTY
|- SET_TO_LIST ∅ = []
SET_TO_LIST_IND
|- ∀P. (∀s. (FINITE s ∧ s ≠ ∅ ⇒ P (REST s)) ⇒ P s) ⇒ ∀v. P v
SET_TO_LIST_THM
|- FINITE s ⇒
   (SET_TO_LIST s = if s = ∅ then [] else CHOICE s::SET_TO_LIST (REST s))
LIST_TO_SET_FILTER
|- LIST_TO_SET (FILTER P l) = {x | P x} ∩ LIST_TO_SET l
LIST_TO_SET_MAP
|- ∀f l. LIST_TO_SET (MAP f l) = IMAGE f (LIST_TO_SET l)
LIST_TO_SET_THM
|- (LIST_TO_SET [] = ∅) ∧ (LIST_TO_SET (h::t) = h INSERT LIST_TO_SET t)
LIST_TO_SET_REVERSE
|- ∀ls. LIST_TO_SET (REVERSE ls) = LIST_TO_SET ls
ALL_DISTINCT_CARD_LIST_TO_SET
|- ∀ls. ALL_DISTINCT ls ⇒ (CARD (LIST_TO_SET ls) = LENGTH ls)
CARD_LIST_TO_SET
|- CARD (LIST_TO_SET ls) ≤ LENGTH ls
INJ_MAP_EQ
|- ∀f l1 l2.
     INJ f (LIST_TO_SET l1 ∪ LIST_TO_SET l2) 𝕌(:β) ∧ (MAP f l1 = MAP f l2) ⇒
     (l1 = l2)
SUM_MAP_MEM_bound
|- ∀f x ls. MEM x ls ⇒ f x ≤ SUM (MAP f ls)
SUM_IMAGE_LIST_TO_SET_upper_bound
|- ∀ls. ∑ f (LIST_TO_SET ls) ≤ SUM (MAP f ls)
FINITE_LIST_TO_SET
|- ∀l. FINITE (LIST_TO_SET l)
LIST_TO_SET_EQ_EMPTY
|- ((LIST_TO_SET l = ∅) ⇔ (l = [])) ∧ ((∅ = LIST_TO_SET l) ⇔ (l = []))
UNION_APPEND
|- ∀l1 l2. LIST_TO_SET l1 ∪ LIST_TO_SET l2 = LIST_TO_SET (l1 ++ l2)
LIST_TO_SET_APPEND
|- ∀l1 l2. LIST_TO_SET (l1 ++ l2) = LIST_TO_SET l1 ∪ LIST_TO_SET l2
LRC_MEM_right
|- LRC R (h::t) x y ∧ MEM e t ⇒ ∃z p. R z e ∧ LRC R p x z
LRC_MEM
|- LRC R ls x y ∧ MEM e ls ⇒ ∃z t. R e z ∧ LRC R t z y
NRC_LRC
|- NRC R n x y ⇔ ∃ls. LRC R ls x y ∧ (LENGTH ls = n)
ALL_DISTINCT_REVERSE
|- ∀l. ALL_DISTINCT (REVERSE l) ⇔ ALL_DISTINCT l
ALL_DISTINCT_ZIP_SWAP
|- ∀l1 l2.
     ALL_DISTINCT (ZIP (l1,l2)) ∧ (LENGTH l1 = LENGTH l2) ⇒
     ALL_DISTINCT (ZIP (l2,l1))
ALL_DISTINCT_ZIP
|- ∀l1 l2.
     ALL_DISTINCT l1 ∧ (LENGTH l1 = LENGTH l2) ⇒ ALL_DISTINCT (ZIP (l1,l2))
ALL_DISTINCT_SING
|- ∀x. ALL_DISTINCT [x]
ALL_DISTINCT_APPEND
|- ∀l1 l2.
     ALL_DISTINCT (l1 ++ l2) ⇔
     ALL_DISTINCT l1 ∧ ALL_DISTINCT l2 ∧ ∀e. MEM e l1 ⇒ ¬MEM e l2
ALL_DISTINCT_EL_IMP
|- ∀l n1 n2.
     ALL_DISTINCT l ∧ n1 < LENGTH l ∧ n2 < LENGTH l ⇒
     ((EL n1 l = EL n2 l) ⇔ (n1 = n2))
EL_ALL_DISTINCT_EL_EQ
|- ∀l.
     ALL_DISTINCT l ⇔
     ∀n1 n2. n1 < LENGTH l ∧ n2 < LENGTH l ⇒ ((EL n1 l = EL n2 l) ⇔ (n1 = n2))
ALL_DISTINCT_MAP
|- ∀f ls. ALL_DISTINCT (MAP f ls) ⇒ ALL_DISTINCT ls
FILTER_ALL_DISTINCT
|- ∀P l. ALL_DISTINCT l ⇒ ALL_DISTINCT (FILTER P l)
ALL_DISTINCT_FILTER
|- ∀l. ALL_DISTINCT l ⇔ ∀x. MEM x l ⇒ (FILTER ($= x) l = [x])
EVERY2_mono
|- (∀x y. R1 x y ⇒ R2 x y) ⇒ LIST_REL R1 l1 l2 ⇒ LIST_REL R2 l1 l2
EVERY2_LENGTH
|- ∀P l1 l2. LIST_REL P l1 l2 ⇒ (LENGTH l1 = LENGTH l2)
EVERY2_EVERY
|- ∀l1 l2 f.
     LIST_REL f l1 l2 ⇔
     (LENGTH l1 = LENGTH l2) ∧ EVERY (UNCURRY f) (ZIP (l1,l2))
MAP_EQ_EVERY2
|- ∀f1 f2 l1 l2.
     (MAP f1 l1 = MAP f2 l2) ⇔
     (LENGTH l1 = LENGTH l2) ∧ LIST_REL (λx y. f1 x = f2 y) l1 l2
EVERY2_cong
|- ∀l1 l1' l2 l2' P P'.
     (l1 = l1') ∧ (l2 = l2') ∧
     (∀x y. MEM x l1' ∧ MEM y l2' ⇒ (P x y ⇔ P' x y)) ⇒
     (LIST_REL P l1 l2 ⇔ LIST_REL P' l1' l2')
FOLDL2_FOLDL
|- ∀l1 l2.
     (LENGTH l1 = LENGTH l2) ⇒
     ∀f a. FOLDL2 f a l1 l2 = FOLDL (λa. UNCURRY (f a)) a (ZIP (l1,l2))
FOLDL2_cong
|- ∀l1 l1' l2 l2' a a' f f'.
     (l1 = l1') ∧ (l2 = l2') ∧ (a = a') ∧
     (∀z b c. MEM b l1' ∧ MEM c l2' ⇒ (f z b c = f' z b c)) ⇒
     (FOLDL2 f a l1 l2 = FOLDL2 f' a' l1' l2')
FOLDL2_def
|- (∀f cs c bs b a. FOLDL2 f a (b::bs) (c::cs) = FOLDL2 f (f a b c) bs cs) ∧
   (∀f cs a. FOLDL2 f a [] cs = a) ∧ ∀v7 v6 f a. FOLDL2 f a (v6::v7) [] = a
FOLDL2_ind
|- ∀P.
     (∀f a b bs c cs. P f (f a b c) bs cs ⇒ P f a (b::bs) (c::cs)) ∧
     (∀f a cs. P f a [] cs) ∧ (∀f a v6 v7. P f a (v6::v7) []) ⇒
     ∀v v1 v2 v3. P v v1 v2 v3
DROP_NIL
|- ∀ls n. (DROP n ls = []) ⇔ n ≥ LENGTH ls
MEM_DROP
|- ∀x ls n.
     MEM x (DROP n ls) ⇔
     n < LENGTH ls ∧ (x = EL n ls) ∨ MEM x (DROP (SUC n) ls)
LENGTH_DROP
|- ∀n l. LENGTH (DROP n l) = LENGTH l − n
TAKE_DROP
|- ∀n l. TAKE n l ++ DROP n l = l
DROP_0
|- DROP 0 l = l
TAKE_APPEND2
|- ∀n. LENGTH l1 < n ⇒ (TAKE n (l1 ++ l2) = l1 ++ TAKE (n − LENGTH l1) l2)
TAKE_APPEND1
|- ∀n. n ≤ LENGTH l1 ⇒ (TAKE n (l1 ++ l2) = TAKE n l1)
LENGTH_TAKE
|- ∀n l. n ≤ LENGTH l ⇒ (LENGTH (TAKE n l) = n)
TAKE_LENGTH_ID
|- ∀l. TAKE (LENGTH l) l = l
TAKE_0
|- TAKE 0 l = []
LAST_APPEND_CONS
|- ∀h l1 l2. LAST (l1 ++ h::l2) = LAST (h::l2)
LAST_CONS_cond
|- LAST (h::t) = if t = [] then h else LAST t
APPEND_FRONT_LAST
|- ∀l. l ≠ [] ⇒ (FRONT l ++ [LAST l] = l)
FRONT_CONS_EQ_NIL
|- (∀x xs. (FRONT (x::xs) = []) ⇔ (xs = [])) ∧
   (∀x xs. ([] = FRONT (x::xs)) ⇔ (xs = [])) ∧
   ∀x xs. NULL (FRONT (x::xs)) ⇔ NULL xs
LENGTH_FRONT_CONS
|- ∀x xs. LENGTH (FRONT (x::xs)) = LENGTH xs
FRONT_CONS
|- (∀x. FRONT [x] = []) ∧ ∀x y z. FRONT (x::y::z) = x::FRONT (y::z)
LAST_EL
|- ∀ls. ls ≠ [] ⇒ (LAST ls = EL (PRE (LENGTH ls)) ls)
LAST_CONS
|- (∀x. LAST [x] = x) ∧ ∀x y z. LAST (x::y::z) = LAST (y::z)
FILTER_REVERSE
|- ∀l P. FILTER P (REVERSE l) = REVERSE (FILTER P l)
REVERSE_EQ_SING
|- (REVERSE l = [e]) ⇔ (l = [e])
REVERSE_EQ_NIL
|- (REVERSE l = []) ⇔ (l = [])
LENGTH_REVERSE
|- ∀l. LENGTH (REVERSE l) = LENGTH l
MEM_REVERSE
|- ∀l x. MEM x (REVERSE l) ⇔ MEM x l
REVERSE_11
|- ∀l1 l2. (REVERSE l1 = REVERSE l2) ⇔ (l1 = l2)
REVERSE_REVERSE
|- ∀l. REVERSE (REVERSE l) = l
REVERSE_APPEND
|- ∀l1 l2. REVERSE (l1 ++ l2) = REVERSE l2 ++ REVERSE l1
LIST_REL_EVERY_ZIP
|- ∀R l1 l2.
     LIST_REL R l1 l2 ⇔
     (LENGTH l1 = LENGTH l2) ∧ EVERY (UNCURRY R) (ZIP (l1,l2))
SUM_MAP_PLUS_ZIP
|- ∀ls1 ls2.
     (LENGTH ls1 = LENGTH ls2) ∧ (∀x y. f (x,y) = g x + h y) ⇒
     (SUM (MAP f (ZIP (ls1,ls2))) = SUM (MAP g ls1) + SUM (MAP h ls2))
MEM_EL
|- ∀l x. MEM x l ⇔ ∃n. n < LENGTH l ∧ (x = EL n l)
MAP_ZIP
|- (LENGTH l1 = LENGTH l2) ⇒
   (MAP FST (ZIP (l1,l2)) = l1) ∧ (MAP SND (ZIP (l1,l2)) = l2) ∧
   (MAP (f o FST) (ZIP (l1,l2)) = MAP f l1) ∧
   (MAP (g o SND) (ZIP (l1,l2)) = MAP g l2)
MAP2_MAP
|- ∀l1 l2.
     (LENGTH l1 = LENGTH l2) ⇒
     ∀f. MAP2 f l1 l2 = MAP (UNCURRY f) (ZIP (l1,l2))
MAP2_ZIP
|- ∀l1 l2.
     (LENGTH l1 = LENGTH l2) ⇒
     ∀f. MAP2 f l1 l2 = MAP (UNCURRY f) (ZIP (l1,l2))
EL_ZIP
|- ∀l1 l2 n.
     (LENGTH l1 = LENGTH l2) ∧ n < LENGTH l1 ⇒
     (EL n (ZIP (l1,l2)) = (EL n l1,EL n l2))
MEM_ZIP
|- ∀l1 l2 p.
     (LENGTH l1 = LENGTH l2) ⇒
     (MEM p (ZIP (l1,l2)) ⇔ ∃n. n < LENGTH l1 ∧ (p = (EL n l1,EL n l2)))
ZIP_MAP
|- ∀l1 l2 f1 f2.
     (LENGTH l1 = LENGTH l2) ⇒
     (ZIP (MAP f1 l1,l2) = MAP (λp. (f1 (FST p),SND p)) (ZIP (l1,l2))) ∧
     (ZIP (l1,MAP f2 l2) = MAP (λp. (FST p,f2 (SND p))) (ZIP (l1,l2)))
UNZIP_ZIP
|- ∀l1 l2. (LENGTH l1 = LENGTH l2) ⇒ (UNZIP (ZIP (l1,l2)) = (l1,l2))
ZIP_UNZIP
|- ∀l. ZIP (UNZIP l) = l
LENGTH_UNZIP
|- ∀pl.
     (LENGTH (FST (UNZIP pl)) = LENGTH pl) ∧
     (LENGTH (SND (UNZIP pl)) = LENGTH pl)
LENGTH_ZIP
|- ∀l1 l2.
     (LENGTH l1 = LENGTH l2) ⇒
     (LENGTH (ZIP (l1,l2)) = LENGTH l1) ∧ (LENGTH (ZIP (l1,l2)) = LENGTH l2)
UNZIP_MAP
|- ∀L. UNZIP L = (MAP FST L,MAP SND L)
UNZIP_THM
|- (UNZIP [] = ([],[])) ∧
   (UNZIP ((x,y)::t) = (let (L1,L2) = UNZIP t in (x::L1,y::L2)))
EVERY_MONOTONIC
|- ∀P Q. (∀x. P x ⇒ Q x) ⇒ ∀l. EVERY P l ⇒ EVERY Q l
EVERY_CONG
|- ∀l1 l2 P P'.
     (l1 = l2) ∧ (∀x. MEM x l2 ⇒ (P x ⇔ P' x)) ⇒ (EVERY P l1 ⇔ EVERY P' l2)
EXISTS_CONG
|- ∀l1 l2 P P'.
     (l1 = l2) ∧ (∀x. MEM x l2 ⇒ (P x ⇔ P' x)) ⇒ (EXISTS P l1 ⇔ EXISTS P' l2)
MAP2_CONG
|- ∀l1 l1' l2 l2' f f'.
     (l1 = l1') ∧ (l2 = l2') ∧
     (∀x y. MEM x l1' ∧ MEM y l2' ⇒ (f x y = f' x y)) ⇒
     (MAP2 f l1 l2 = MAP2 f' l1' l2')
MAP_CONG
|- ∀l1 l2 f f'.
     (l1 = l2) ∧ (∀x. MEM x l2 ⇒ (f x = f' x)) ⇒ (MAP f l1 = MAP f' l2)
FOLDL_CONG
|- ∀l l' b b' f f'.
     (l = l') ∧ (b = b') ∧ (∀x a. MEM x l' ⇒ (f a x = f' a x)) ⇒
     (FOLDL f b l = FOLDL f' b' l')
FOLDR_CONG
|- ∀l l' b b' f f'.
     (l = l') ∧ (b = b') ∧ (∀x a. MEM x l' ⇒ (f x a = f' x a)) ⇒
     (FOLDR f b l = FOLDR f' b' l')
list_size_cong
|- ∀M N f f'.
     (M = N) ∧ (∀x. MEM x N ⇒ (f x = f' x)) ⇒ (list_size f M = list_size f' N)
LIST_REL_LENGTH
|- ∀x y. LIST_REL R x y ⇒ (LENGTH x = LENGTH y)
LIST_REL_MAP2
|- LIST_REL (λa b. R a b) l1 (MAP f l2) ⇔ LIST_REL (λa b. R a (f b)) l1 l2
LIST_REL_MAP1
|- LIST_REL R (MAP f l1) l2 ⇔ LIST_REL (R o f) l1 l2
LIST_REL_CONJ
|- LIST_REL (λa b. P a b ∧ Q a b) l1 l2 ⇔
   LIST_REL (λa b. P a b) l1 l2 ∧ LIST_REL (λa b. Q a b) l1 l2
LIST_REL_CONS2
|- LIST_REL R xs (h::t) ⇔ ∃h' t'. (xs = h'::t') ∧ R h' h ∧ LIST_REL R t' t
LIST_REL_CONS1
|- LIST_REL R (h::t) xs ⇔ ∃h' t'. (xs = h'::t') ∧ R h h' ∧ LIST_REL R t t'
LIST_REL_NIL
|- (LIST_REL R [] x ⇔ (x = [])) ∧ (LIST_REL R [] y ⇔ (y = []))
LIST_REL_mono
|- (∀x y. R1 x y ⇒ R2 x y) ⇒ LIST_REL R1 l1 l2 ⇒ LIST_REL R2 l1 l2
LIST_REL_def
|- (LIST_REL R [] [] ⇔ T) ∧ (LIST_REL R (a::as) [] ⇔ F) ∧
   (LIST_REL R [] (b::bs) ⇔ F) ∧
   (LIST_REL R (a::as) (b::bs) ⇔ R a b ∧ LIST_REL R as bs)
WF_LIST_PRED
|- WF (λL1 L2. ∃h. L2 = h::L1)
NULL_FILTER
|- ∀P ls. NULL (FILTER P ls) ⇔ ∀x. MEM x ls ⇒ ¬P x
SUM_eq_0
|- ∀ls. (SUM ls = 0) ⇔ ∀x. MEM x ls ⇒ (x = 0)
EL_simp_restricted
|- (EL (NUMERAL (BIT1 n)) (l::ls) = EL (PRE (NUMERAL (BIT1 n))) ls) ∧
   (EL (NUMERAL (BIT2 n)) (l::ls) = EL (NUMERAL (BIT1 n)) ls)
EL_restricted
|- (EL 0 = HD) ∧ (EL (SUC n) (l::ls) = EL n ls)
EL_simp
|- (EL (NUMERAL (BIT1 n)) l = EL (PRE (NUMERAL (BIT1 n))) (TL l)) ∧
   (EL (NUMERAL (BIT2 n)) l = EL (NUMERAL (BIT1 n)) (TL l))
EL_compute
|- ∀n. EL n l = if n = 0 then HD l else EL (PRE n) (TL l)
NOT_NULL_MEM
|- ∀l. ¬NULL l ⇔ ∃e. MEM e l
FILTER_COND_REWRITE
|- (FILTER P [] = []) ∧ (∀h. P h ⇒ (FILTER P (h::l) = h::FILTER P l)) ∧
   ∀h. ¬P h ⇒ (FILTER P (h::l) = FILTER P l)
EVERY_FILTER_IMP
|- ∀P1 P2 l. EVERY P1 l ⇒ EVERY P1 (FILTER P2 l)
EVERY_FILTER
|- ∀P1 P2 l. EVERY P1 (FILTER P2 l) ⇔ EVERY (λx. P2 x ⇒ P1 x) l
FILTER_EQ_APPEND
|- ∀P l l1 l2.
     (FILTER P l = l1 ++ l2) ⇔
     ∃l3 l4. (l = l3 ++ l4) ∧ (FILTER P l3 = l1) ∧ (FILTER P l4 = l2)
MEM
|- (∀x. MEM x [] ⇔ F) ∧ ∀x h t. MEM x (h::t) ⇔ (x = h) ∨ MEM x t
FILTER_APPEND_DISTRIB
|- ∀P L M. FILTER P (L ++ M) = FILTER P L ++ FILTER P M
FILTER_EQ_CONS
|- ∀P l h lr.
     (FILTER P l = h::lr) ⇔
     ∃l1 l2.
       (l = l1 ++ [h] ++ l2) ∧ (FILTER P l1 = []) ∧ (FILTER P l2 = lr) ∧ P h
FILTER_NEQ_ID
|- ∀P l. FILTER P l ≠ l ⇔ ∃x. MEM x l ∧ ¬P x
FILTER_EQ_ID
|- ∀P l. (FILTER P l = l) ⇔ EVERY P l
FILTER_NEQ_NIL
|- ∀P l. FILTER P l ≠ [] ⇔ ∃x. MEM x l ∧ P x
FILTER_EQ_NIL
|- ∀P l. (FILTER P l = []) ⇔ EVERY (λx. ¬P x) l
LENGTH_TL
|- ∀l. 0 < LENGTH l ⇒ (LENGTH (TL l) = LENGTH l − 1)
FOLDR_CONS
|- ∀f ls a. FOLDR (λx y. f x::y) a ls = MAP f ls ++ a
FOLDL_EQ_FOLDR
|- ∀f l e. ASSOC f ∧ COMM f ⇒ (FOLDL f e l = FOLDR f e l)
LIST_EQ
|- ∀l1 l2.
     (LENGTH l1 = LENGTH l2) ∧ (∀x. x < LENGTH l1 ⇒ (EL x l1 = EL x l2)) ⇒
     (l1 = l2)
LIST_EQ_REWRITE
|- ∀l1 l2.
     (l1 = l2) ⇔
     (LENGTH l1 = LENGTH l2) ∧ ∀x. x < LENGTH l1 ⇒ (EL x l1 = EL x l2)
MEM_SPLIT
|- ∀x l. MEM x l ⇔ ∃l1 l2. l = l1 ++ x::l2
APPEND_EQ_SELF
|- (∀l1 l2. (l1 ++ l2 = l1) ⇔ (l2 = [])) ∧
   (∀l1 l2. (l1 ++ l2 = l2) ⇔ (l1 = [])) ∧
   (∀l1 l2. (l1 = l1 ++ l2) ⇔ (l2 = [])) ∧ ∀l1 l2. (l2 = l1 ++ l2) ⇔ (l1 = [])
APPEND_11_LENGTH
|- (∀l1 l2 l1' l2'.
      (LENGTH l1 = LENGTH l1') ⇒
      ((l1 ++ l2 = l1' ++ l2') ⇔ (l1 = l1') ∧ (l2 = l2'))) ∧
   ∀l1 l2 l1' l2'.
     (LENGTH l2 = LENGTH l2') ⇒
     ((l1 ++ l2 = l1' ++ l2') ⇔ (l1 = l1') ∧ (l2 = l2'))
APPEND_LENGTH_EQ
|- ∀l1 l1'.
     (LENGTH l1 = LENGTH l1') ⇒
     ∀l2 l2'.
       (LENGTH l2 = LENGTH l2') ⇒
       ((l1 ++ l2 = l1' ++ l2') ⇔ (l1 = l1') ∧ (l2 = l2'))
APPEND_11
|- (∀l1 l2 l3. (l1 ++ l2 = l1 ++ l3) ⇔ (l2 = l3)) ∧
   ∀l1 l2 l3. (l2 ++ l1 = l3 ++ l1) ⇔ (l2 = l3)
APPEND_EQ_SING
|- (l1 ++ l2 = [e]) ⇔ (l1 = [e]) ∧ (l2 = []) ∨ (l1 = []) ∧ (l2 = [e])
APPEND_eq_NIL
|- (∀l1 l2. ([] = l1 ++ l2) ⇔ (l1 = []) ∧ (l2 = [])) ∧
   ∀l1 l2. (l1 ++ l2 = []) ⇔ (l1 = []) ∧ (l2 = [])
CONS_ACYCLIC
|- ∀l x. l ≠ x::l ∧ x::l ≠ l
LENGTH_EQ_NIL
|- ∀P. (∀l. (LENGTH l = 0) ⇒ P l) ⇔ P []
LENGTH_EQ_NUM_compute
|- (∀l. (LENGTH l = 0) ⇔ (l = [])) ∧
   (∀l n.
      (LENGTH l = NUMERAL (BIT1 n)) ⇔
      ∃h l'. (LENGTH l' = NUMERAL (BIT1 n) − 1) ∧ (l = h::l')) ∧
   (∀l n.
      (LENGTH l = NUMERAL (BIT2 n)) ⇔
      ∃h l'. (LENGTH l' = NUMERAL (BIT1 n)) ∧ (l = h::l')) ∧
   ∀l n1 n2.
     (LENGTH l = n1 + n2) ⇔
     ∃l1 l2. (LENGTH l1 = n1) ∧ (LENGTH l2 = n2) ∧ (l = l1 ++ l2)
LENGTH_EQ_NUM
|- (∀l. (LENGTH l = 0) ⇔ (l = [])) ∧
   (∀l n. (LENGTH l = SUC n) ⇔ ∃h l'. (LENGTH l' = n) ∧ (l = h::l')) ∧
   ∀l n1 n2.
     (LENGTH l = n1 + n2) ⇔
     ∃l1 l2. (LENGTH l1 = n1) ∧ (LENGTH l2 = n2) ∧ (l = l1 ++ l2)
LENGTH_EQ_SUM
|- ∀l n1 n2.
     (LENGTH l = n1 + n2) ⇔
     ∃l1 l2. (LENGTH l1 = n1) ∧ (LENGTH l2 = n2) ∧ (l = l1 ++ l2)
LENGTH_EQ_CONS
|- ∀P n.
     (∀l. (LENGTH l = SUC n) ⇒ P l) ⇔
     ∀l. (LENGTH l = n) ⇒ (λl. ∀x. P (x::l)) l
LENGTH_CONS
|- ∀l n. (LENGTH l = SUC n) ⇔ ∃h l'. (LENGTH l' = n) ∧ (l = h::l')
NULL_LENGTH
|- ∀l. NULL l ⇔ (LENGTH l = 0)
NULL_EQ
|- ∀l. NULL l ⇔ (l = [])
LENGTH_NIL_SYM
|- (0 = LENGTH l) ⇔ (l = [])
LENGTH_NIL
|- ∀l. (LENGTH l = 0) ⇔ (l = [])
MEM_MAP
|- ∀l f x. MEM x (MAP f l) ⇔ ∃y. (x = f y) ∧ MEM y l
NOT_EXISTS
|- ∀P l. ¬EXISTS P l ⇔ EVERY ($~ o P) l
NOT_EVERY
|- ∀P l. ¬EVERY P l ⇔ EXISTS ($~ o P) l
EXISTS_APPEND
|- ∀P l1 l2. EXISTS P (l1 ++ l2) ⇔ EXISTS P l1 ∨ EXISTS P l2
EVERY_APPEND
|- ∀P l1 l2. EVERY P (l1 ++ l2) ⇔ EVERY P l1 ∧ EVERY P l2
FLAT_APPEND
|- ∀l1 l2. FLAT (l1 ++ l2) = FLAT l1 ++ FLAT l2
MEM_FLAT
|- ∀x L. MEM x (FLAT L) ⇔ ∃l. MEM l L ∧ MEM x l
MEM_FILTER
|- ∀P L x. MEM x (FILTER P L) ⇔ P x ∧ MEM x L
MEM_APPEND
|- ∀e l1 l2. MEM e (l1 ++ l2) ⇔ MEM e l1 ∨ MEM e l2
EXISTS_NOT_EVERY
|- ∀P l. EXISTS P l ⇔ ¬EVERY (λx. ¬P x) l
EVERY_NOT_EXISTS
|- ∀P l. EVERY P l ⇔ ¬EXISTS (λx. ¬P x) l
MONO_EXISTS
|- (∀x. P x ⇒ Q x) ⇒ EXISTS P l ⇒ EXISTS Q l
EXISTS_SIMP
|- ∀c l. EXISTS (λx. c) l ⇔ l ≠ [] ∧ c
EXISTS_MAP
|- ∀P f l. EXISTS P (MAP f l) ⇔ EXISTS (λx. P (f x)) l
EXISTS_MEM
|- ∀P l. EXISTS P l ⇔ ∃e. MEM e l ∧ P e
MONO_EVERY
|- (∀x. P x ⇒ Q x) ⇒ EVERY P l ⇒ EVERY Q l
EVERY_SIMP
|- ∀c l. EVERY (λx. c) l ⇔ (l = []) ∨ c
EVERY_MAP
|- ∀P f l. EVERY P (MAP f l) ⇔ EVERY (λx. P (f x)) l
EVERY_MEM
|- ∀P l. EVERY P l ⇔ ∀e. MEM e l ⇒ P e
EVERY_CONJ
|- ∀P Q l. EVERY (λx. P x ∧ Q x) l ⇔ EVERY P l ∧ EVERY Q l
EVERY_EL
|- ∀l P. EVERY P l ⇔ ∀n. n < LENGTH l ⇒ P (EL n l)
MAP_TL
|- ∀l f. ¬NULL l ⇒ (MAP f (TL l) = TL (MAP f l))
EL_MAP
|- ∀n l. n < LENGTH l ⇒ ∀f. EL n (MAP f l) = f (EL n l)
MAP_MAP_o
|- ∀f g l. MAP f (MAP g l) = MAP (f o g) l
MAP_o
|- ∀f g. MAP (f o g) = MAP f o MAP g
MAP_EQ_f
|- ∀f1 f2 l. (MAP f1 l = MAP f2 l) ⇔ ∀e. MEM e l ⇒ (f1 e = f2 e)
MAP_EQ_NIL
|- ∀l f. ((MAP f l = []) ⇔ (l = [])) ∧ (([] = MAP f l) ⇔ (l = []))
LENGTH_MAP
|- ∀l f. LENGTH (MAP f l) = LENGTH l
MAP_ID
|- (MAP (λx. x) l = l) ∧ (MAP I l = l)
MAP_APPEND
|- ∀f l1 l2. MAP f (l1 ++ l2) = MAP f l1 ++ MAP f l2
LENGTH_APPEND
|- ∀l1 l2. LENGTH (l1 ++ l2) = LENGTH l1 + LENGTH l2
APPEND_ASSOC
|- ∀l1 l2 l3. l1 ++ (l2 ++ l3) = l1 ++ l2 ++ l3
APPEND_NIL
|- ∀l. l ++ [] = l
CONS
|- ∀l. ¬NULL l ⇒ (HD l::TL l = l)
EQ_LIST
|- ∀h1 h2. (h1 = h2) ⇒ ∀l1 l2. (l1 = l2) ⇒ (h1::l1 = h2::l2)
NOT_EQ_LIST
|- ∀h1 h2. h1 ≠ h2 ⇒ ∀l1 l2. h1::l1 ≠ h2::l2
LIST_NOT_EQ
|- ∀l1 l2. l1 ≠ l2 ⇒ ∀h1 h2. h1::l1 ≠ h2::l2
NOT_CONS_NIL
|- ∀a1 a0. a0::a1 ≠ []
NOT_NIL_CONS
|- ∀a1 a0. [] ≠ a0::a1
CONS_11
|- ∀a0 a1 a0' a1'. (a0::a1 = a0'::a1') ⇔ (a0 = a0') ∧ (a1 = a1')
list_case_compute
|- ∀l. list_CASE l b f = if NULL l then b else f (HD l) (TL l)
list_nchotomy
|- ∀l. (l = []) ∨ ∃h t. l = h::t
list_case_cong
|- ∀M M' v f.
     (M = M') ∧ ((M' = []) ⇒ (v = v')) ∧
     (∀a0 a1. (M' = a0::a1) ⇒ (f a0 a1 = f' a0 a1)) ⇒
     (list_CASE M v f = list_CASE M' v' f')
list_distinct
|- ∀a1 a0. [] ≠ a0::a1
list_11
|- ∀a0 a1 a0' a1'. (a0::a1 = a0'::a1') ⇔ (a0 = a0') ∧ (a1 = a1')
datatype_list
|- DATATYPE (list [] CONS)
list_Axiom_old
|- ∀x f. ∃!fn1. (fn1 [] = x) ∧ ∀h t. fn1 (h::t) = f (fn1 t) h t
LIST_TO_SET
|- (LIST_TO_SET [] = ∅) ∧ (LIST_TO_SET (h::t) = h INSERT LIST_TO_SET t)
IN_LIST_TO_SET
|- T
MAP2_ind
|- ∀P.
     (∀f h1 t1 h2 t2. P f t1 t2 ⇒ P f (h1::t1) (h2::t2)) ∧ (∀f y. P f [] y) ∧
     (∀f v4 v5. P f (v4::v5) []) ⇒
     ∀v v1 v2. P v v1 v2
MAP2_def
|- (∀t2 t1 h2 h1 f. MAP2 f (h1::t1) (h2::t2) = f h1 h2::MAP2 f t1 t2) ∧
   (∀y f. MAP2 f [] y = []) ∧ ∀v5 v4 f. MAP2 f (v4::v5) [] = []
MAP2
|- (∀f. MAP2 f [] [] = []) ∧
   ∀f h1 t1 h2 t2. MAP2 f (h1::t1) (h2::t2) = f h1 h2::MAP2 f t1 t2
NULL
|- NULL [] ∧ ∀h t. ¬NULL (h::t)
list_INDUCT
|- ∀P. P [] ∧ (∀t. P t ⇒ ∀h. P (h::t)) ⇒ ∀l. P l
list_Axiom
|- ∀f0 f1. ∃fn. (fn [] = f0) ∧ ∀a0 a1. fn (a0::a1) = f1 a0 a1 (fn a1)
list_induction
|- ∀P. P [] ∧ (∀t. P t ⇒ ∀h. P (h::t)) ⇒ ∀l. P l
LIST_REL_EL_EQN
|- ∀R l1 l2.
     LIST_REL R l1 l2 ⇔
     (LENGTH l1 = LENGTH l2) ∧ ∀n. n < LENGTH l1 ⇒ R (EL n l1) (EL n l2)
LIST_REL_cases
|- ∀R a0 a1.
     LIST_REL R a0 a1 ⇔
     (a0 = []) ∧ (a1 = []) ∨
     ∃h1 h2 t1 t2. (a0 = h1::t1) ∧ (a1 = h2::t2) ∧ R h1 h2 ∧ LIST_REL R t1 t2
LIST_REL_strongind
|- ∀R LIST_REL'.
     LIST_REL' [] [] ∧
     (∀h1 h2 t1 t2.
        R h1 h2 ∧ LIST_REL R t1 t2 ∧ LIST_REL' t1 t2 ⇒
        LIST_REL' (h1::t1) (h2::t2)) ⇒
     ∀a0 a1. LIST_REL R a0 a1 ⇒ LIST_REL' a0 a1
LIST_REL_ind
|- ∀R LIST_REL'.
     LIST_REL' [] [] ∧
     (∀h1 h2 t1 t2. R h1 h2 ∧ LIST_REL' t1 t2 ⇒ LIST_REL' (h1::t1) (h2::t2)) ⇒
     ∀a0 a1. LIST_REL R a0 a1 ⇒ LIST_REL' a0 a1
LIST_REL_rules
|- ∀R.
     LIST_REL R [] [] ∧
     ∀h1 h2 t1 t2. R h1 h2 ∧ LIST_REL R t1 t2 ⇒ LIST_REL R (h1::t1) (h2::t2)
list_CASES
|- ∀l. (l = []) ∨ ∃h t. l = h::t
FORALL_LIST
|- (∀l. P l) ⇔ P [] ∧ ∀h t. P (h::t)
MEM_SPLIT_APPEND_first
|- MEM e l ⇔ ∃pfx sfx. (l = pfx ++ [e] ++ sfx) ∧ ¬MEM e pfx
MEM_SPLIT_APPEND_last
|- MEM e l ⇔ ∃pfx sfx. (l = pfx ++ [e] ++ sfx) ∧ ¬MEM e sfx
APPEND_EQ_APPEND
|- (l1 ++ l2 = m1 ++ m2) ⇔
   (∃l. (l1 = m1 ++ l) ∧ (m2 = l ++ l2)) ∨ ∃l. (m1 = l1 ++ l) ∧ (l2 = l ++ m2)
APPEND_EQ_CONS
|- (l1 ++ l2 = h::t) ⇔
   (l1 = []) ∧ (l2 = h::t) ∨ ∃lt. (l1 = h::lt) ∧ (t = lt ++ l2)
APPEND_EQ_APPEND_MID
|- (l1 ++ [e] ++ l2 = m1 ++ m2) ⇔
   (∃l. (m1 = l1 ++ [e] ++ l) ∧ (l2 = l ++ m2)) ∨
   ∃l. (l1 = m1 ++ l) ∧ (m2 = l ++ [e] ++ l2)
LUPDATE_SEM
|- (∀e n l. LENGTH (LUPDATE e n l) = LENGTH l) ∧
   ∀e n l p.
     p < LENGTH l ⇒ (EL p (LUPDATE e n l) = if p = n then e else EL p l)
EL_LUPDATE
|- ∀ys x i k.
     EL i (LUPDATE x k ys) = if (i = k) ∧ k < LENGTH ys then x else EL i ys
LENGTH_LUPDATE
|- ∀x n ys. LENGTH (LUPDATE x n ys) = LENGTH ys
LUPDATE_LENGTH
|- ∀xs x y ys. LUPDATE x (LENGTH xs) (xs ++ y::ys) = xs ++ x::ys
LUPDATE_SNOC
|- ∀ys k x y.
     LUPDATE x k (SNOC y ys) =
     if k = LENGTH ys then SNOC x ys else SNOC y (LUPDATE x k ys)
MEM_LUPDATE_E
|- ∀l x y i. MEM x (LUPDATE y i l) ⇒ (x = y) ∨ MEM x l
MEM_LUPDATE
|- ∀l x y i.
     MEM x (LUPDATE y i l) ⇔
     i < LENGTH l ∧ (x = y) ∨ ∃j. j < LENGTH l ∧ i ≠ j ∧ (EL j l = x)
LUPDATE_compute
|- (∀e n. LUPDATE e n [] = []) ∧ (∀e x l. LUPDATE e 0 (x::l) = e::l) ∧
   (∀e n x l.
      LUPDATE e (NUMERAL (BIT1 n)) (x::l) =
      x::LUPDATE e (NUMERAL (BIT1 n) − 1) l) ∧
   ∀e n x l.
     LUPDATE e (NUMERAL (BIT2 n)) (x::l) = x::LUPDATE e (NUMERAL (BIT1 n)) l
LUPDATE_MAP
|- ∀x n l f. MAP f (LUPDATE x n l) = LUPDATE (f x) n (MAP f l)
splitAtPki_APPEND
|- ∀l1 l2 P k.
     EVERYi (λi. $~ o P i) l1 ∧ (0 < LENGTH l2 ⇒ P (LENGTH l1) (HD l2)) ⇒
     (splitAtPki P k (l1 ++ l2) = k l1 l2)
splitAtPki_EQN
|- splitAtPki P k l =
   case OLEAST i. i < LENGTH l ∧ P i (EL i l) of
     NONE => k l []
   | SOME i => k (TAKE i l) (DROP i l)
TAKE_LENGTH_TOO_LONG
|- ∀l n. LENGTH l ≤ n ⇒ (TAKE n l = l)
DROP_LENGTH_TOO_LONG
|- ∀l n. LENGTH l ≤ n ⇒ (DROP n l = [])
TAKE_splitAtPki
|- TAKE n l = splitAtPki (K o $= n) K l
DROP_splitAtPki
|- DROP n l = splitAtPki (K o $= n) (K I) l
LIST_BIND_THM
|- (LIST_BIND [] f = []) ∧ (LIST_BIND (h::t) f = f h ++ LIST_BIND t f)
LIST_BIND_ID
|- (LIST_BIND l (λx. x) = FLAT l) ∧ (LIST_BIND l I = FLAT l)
LIST_BIND_APPEND
|- LIST_BIND (l1 ++ l2) f = LIST_BIND l1 f ++ LIST_BIND l2 f
LIST_BIND_MAP
|- LIST_BIND (MAP f l) g = LIST_BIND l (g o f)
MAP_LIST_BIND
|- MAP f (LIST_BIND l g) = LIST_BIND l (MAP f o g)
LIST_BIND_LIST_BIND
|- LIST_BIND (LIST_BIND l g) f = LIST_BIND l (combin$C LIST_BIND f o g)
SINGL_LIST_APPLY_L
|- LIST_BIND [x] f = f x
SINGL_LIST_APPLY_R
|- LIST_BIND l (λx. [x]) = l
SINGL_APPLY_MAP
|- [f] <*> l = MAP f l
SINGL_SINGL_APPLY
|- [f] <*> [x] = [f x]
SINGL_APPLY_PERMUTE
|- fs <*> [x] = [(λf. f x)] <*> fs
MAP_FLAT
|- MAP f (FLAT l) = FLAT (MAP (MAP f) l)
LIST_APPLY_o
|- [$o] <*> fs <*> gs <*> xs = fs <*> (gs <*> xs)
LLEX_THM
|- (¬LLEX R [] [] ∧ ¬LLEX R (h1::t1) []) ∧ LLEX R [] (h2::t2) ∧
   (LLEX R (h1::t1) (h2::t2) ⇔ R h1 h2 ∨ (h1 = h2) ∧ LLEX R t1 t2)
LLEX_NIL2
|- ¬LLEX R l []
LLEX_transitive
|- transitive R ⇒ transitive (LLEX R)
LLEX_total
|- total (RC R) ⇒ total (RC (LLEX R))
LLEX_not_WF
|- (∃a b. R a b) ⇒ ¬WF (LLEX R)
nub_set
|- ∀l. LIST_TO_SET (nub l) = LIST_TO_SET l
all_distinct_nub
|- ∀l. ALL_DISTINCT (nub l)
nub_append
|- ∀l1 l2. nub (l1 ++ l2) = nub (FILTER (λx. ¬MEM x l2) l1) ++ nub l2
list_to_set_diff
|- ∀l1 l2.
     LIST_TO_SET l2 DIFF LIST_TO_SET l1 =
     LIST_TO_SET (FILTER (λx. ¬MEM x l1) l2)
length_nub_append
|- ∀l1 l2.
     LENGTH (nub (l1 ++ l2)) =
     LENGTH (nub l1) + LENGTH (nub (FILTER (λx. ¬MEM x l1) l2))
ALL_DISTINCT_DROP
|- ∀ls n. ALL_DISTINCT ls ⇒ ALL_DISTINCT (DROP n ls)
EXISTS_LIST_EQ_MAP
|- ∀ls f. EVERY (λx. ∃y. x = f y) ls ⇒ ∃l. ls = MAP f l
LIST_TO_SET_FLAT
|- ∀ls. LIST_TO_SET (FLAT ls) = BIGUNION (LIST_TO_SET (MAP LIST_TO_SET ls))
MEM_APPEND_lemma
|- ∀a b c d x.
     (a ++ [x] ++ b = c ++ [x] ++ d) ∧ ¬MEM x b ∧ ¬MEM x a ⇒ (a = c) ∧ (b = d)
EVERY2_REVERSE
|- ∀R l1 l2. LIST_REL R l1 l2 ⇒ LIST_REL R (REVERSE l1) (REVERSE l2)
SUM_MAP_PLUS
|- ∀f g ls. SUM (MAP (λx. f x + g x) ls) = SUM (MAP f ls) + SUM (MAP g ls)
TAKE_LENGTH_ID_rwt
|- ∀l m. (m = LENGTH l) ⇒ (TAKE m l = l)
ZIP_DROP
|- ∀a b n.
     n ≤ LENGTH a ∧ (LENGTH a = LENGTH b) ⇒
     (ZIP (DROP n a,DROP n b) = DROP n (ZIP (a,b)))
GENLIST_EL
|- ∀ls f n.
     (n = LENGTH ls) ∧ (∀i. i < n ⇒ (f i = EL i ls)) ⇒ (GENLIST f n = ls)
EVERY2_trans
|- (∀x y z. R x y ∧ R y z ⇒ R x z) ⇒
   ∀x y z. LIST_REL R x y ∧ LIST_REL R y z ⇒ LIST_REL R x z
EVERY2_sym
|- (∀x y. R1 x y ⇒ R2 y x) ⇒ ∀x y. LIST_REL R1 x y ⇒ LIST_REL R2 y x
EVERY2_LUPDATE_same
|- ∀P l1 l2 v1 v2 n.
     P v1 v2 ∧ LIST_REL P l1 l2 ⇒
     LIST_REL P (LUPDATE v1 n l1) (LUPDATE v2 n l2)
EVERY2_refl
|- (∀x. MEM x ls ⇒ R x x) ⇒ LIST_REL R ls ls
EVERY2_THM
|- (∀P ys. LIST_REL P [] ys ⇔ (ys = [])) ∧
   (∀P yys x xs.
      LIST_REL P (x::xs) yys ⇔
      ∃y ys. (yys = y::ys) ∧ P x y ∧ LIST_REL P xs ys) ∧
   (∀P xs. LIST_REL P xs [] ⇔ (xs = [])) ∧
   ∀P xxs y ys.
     LIST_REL P xxs (y::ys) ⇔ ∃x xs. (xxs = x::xs) ∧ P x y ∧ LIST_REL P xs ys
LIST_REL_trans
|- ∀l1 l2 l3.
     (∀n.
        n < LENGTH l1 ∧ R (EL n l1) (EL n l2) ∧ R (EL n l2) (EL n l3) ⇒
        R (EL n l1) (EL n l3)) ∧ LIST_REL R l1 l2 ∧ LIST_REL R l2 l3 ⇒
     LIST_REL R l1 l3
SWAP_REVERSE
|- ∀l1 l2. (l1 = REVERSE l2) ⇔ (l2 = REVERSE l1)
SWAP_REVERSE_SYM
|- ∀l1 l2. (REVERSE l1 = l2) ⇔ (l1 = REVERSE l2)
BIGUNION_IMAGE_set_SUBSET
|- BIGUNION (IMAGE f (LIST_TO_SET ls)) ⊆ s ⇔ ∀x. MEM x ls ⇒ f x ⊆ s
IMAGE_EL_count_LENGTH
|- ∀f ls.
     IMAGE (λn. f (EL n ls)) (count (LENGTH ls)) = IMAGE f (LIST_TO_SET ls)
GENLIST_EL_MAP
|- ∀f ls. GENLIST (λn. f (EL n ls)) (LENGTH ls) = MAP f ls
LENGTH_FILTER_LEQ_MONO
|- ∀P Q. (∀x. P x ⇒ Q x) ⇒ ∀ls. LENGTH (FILTER P ls) ≤ LENGTH (FILTER Q ls)
LIST_EQ_MAP_PAIR
|- ∀l1 l2. (MAP FST l1 = MAP FST l2) ∧ (MAP SND l1 = MAP SND l2) ⇒ (l1 = l2)
TAKE_SUM
|- ∀n m l. n + m ≤ LENGTH l ⇒ (TAKE (n + m) l = TAKE n l ++ TAKE m (DROP n l))
ALL_DISTINCT_FILTER_EL_IMP
|- ∀P l n1 n2.
     ALL_DISTINCT (FILTER P l) ∧ n1 < LENGTH l ∧ n2 < LENGTH l ∧ P (EL n1 l) ∧
     (EL n1 l = EL n2 l) ⇒
     (n1 = n2)
FLAT_EQ_NIL
|- ∀ls. (FLAT ls = []) ⇔ EVERY ($= []) ls
ALL_DISTINCT_MAP_INJ
|- ∀ls f.
     (∀x y. MEM x ls ∧ MEM y ls ∧ (f x = f y) ⇒ (x = y)) ∧ ALL_DISTINCT ls ⇒
     ALL_DISTINCT (MAP f ls)
LENGTH_o_REVERSE
|- (LENGTH o REVERSE = LENGTH) ∧ (LENGTH o REVERSE o f = LENGTH o f)
REVERSE_o_REVERSE
|- REVERSE o REVERSE o f = f
GENLIST_PLUS_APPEND
|- GENLIST ($+ a) n1 ++ GENLIST ($+ (n1 + a)) n2 = GENLIST ($+ a) (n1 + n2)
LIST_TO_SET_GENLIST
|- ∀f n. LIST_TO_SET (GENLIST f n) = IMAGE f (count n)
MEM_ZIP_MEM_MAP
|- (LENGTH (FST ps) = LENGTH (SND ps)) ∧ MEM p (ZIP ps) ⇒
   MEM (FST p) (FST ps) ∧ MEM (SND p) (SND ps)
DISJOINT_GENLIST_PLUS
|- DISJOINT x (LIST_TO_SET (GENLIST ($+ n) (a + b))) ⇒
   DISJOINT x (LIST_TO_SET (GENLIST ($+ n) a)) ∧
   DISJOINT x (LIST_TO_SET (GENLIST ($+ (n + a)) b))
EVERY2_MAP
|- (LIST_REL P (MAP f l1) l2 ⇔ LIST_REL (λx y. P (f x) y) l1 l2) ∧
   (LIST_REL Q l1 (MAP g l2) ⇔ LIST_REL (λx y. Q x (g y)) l1 l2)
exists_list_GENLIST
|- (∃ls. P ls) ⇔ ∃n f. P (GENLIST f n)
EVERY_MEM_MONO
|- ∀P Q l. (∀x. MEM x l ∧ P x ⇒ Q x) ∧ EVERY P l ⇒ EVERY Q l
EVERY2_MEM_MONO
|- ∀P Q l1 l2.
     (∀x. MEM x (ZIP (l1,l2)) ∧ UNCURRY P x ⇒ UNCURRY Q x) ∧
     LIST_REL P l1 l2 ⇒
     LIST_REL Q l1 l2
mem_exists_set
|- ∀x y l. MEM (x,y) l ⇒ ∃z. (x = FST z) ∧ MEM z l
every_zip_snd
|- ∀l1 l2 P.
     (LENGTH l1 = LENGTH l2) ⇒
     (EVERY (λx. P (SND x)) (ZIP (l1,l2)) ⇔ EVERY P l2)
every_zip_fst
|- ∀l1 l2 P.
     (LENGTH l1 = LENGTH l2) ⇒
     (EVERY (λx. P (FST x)) (ZIP (l1,l2)) ⇔ EVERY P l1)
el_append3
|- ∀l1 x l2. EL (LENGTH l1) (l1 ++ [x] ++ l2) = x
lupdate_append
|- ∀x n l1 l2. n < LENGTH l1 ⇒ (LUPDATE x n (l1 ++ l2) = LUPDATE x n l1 ++ l2)
lupdate_append2
|- ∀v l1 x l2 l3. LUPDATE v (LENGTH l1) (l1 ++ [x] ++ l2) = l1 ++ [v] ++ l2
LAST_REVERSE
|- ∀ls. ls ≠ [] ⇒ (LAST (REVERSE ls) = HD ls)
dropWhile_splitAtPki
|- ∀P. dropWhile P = splitAtPki (combin$C (K o $~ o P)) (K I)
dropWhile_eq_nil
|- ∀P ls. (dropWhile P ls = []) ⇔ EVERY P ls
MEM_dropWhile_IMP
|- ∀P ls x. MEM x (dropWhile P ls) ⇒ MEM x ls
HD_dropWhile
|- ∀P ls. EXISTS ($~ o P) ls ⇒ ¬P (HD (dropWhile P ls))
LENGTH_dropWhile_LESS_EQ
|- ∀P ls. LENGTH (dropWhile P ls) ≤ LENGTH ls
dropWhile_APPEND_EVERY
|- ∀P l1 l2. EVERY P l1 ⇒ (dropWhile P (l1 ++ l2) = dropWhile P l2)
dropWhile_APPEND_EXISTS
|- ∀P l1 l2.
     EXISTS ($~ o P) l1 ⇒ (dropWhile P (l1 ++ l2) = dropWhile P l1 ++ l2)
EL_LENGTH_dropWhile_REVERSE
|- ∀P ls k.
     LENGTH (dropWhile P (REVERSE ls)) ≤ k ∧ k < LENGTH ls ⇒ P (EL k ls)
LAST_compute
|- (∀x. LAST [x] = x) ∧ ∀h1 h2 t. LAST (h1::h2::t) = LAST (h2::t)
TAKE_compute
|- (∀l. TAKE 0 l = []) ∧ (∀n. TAKE (NUMERAL (BIT1 n)) [] = []) ∧
   (∀n. TAKE (NUMERAL (BIT2 n)) [] = []) ∧
   (∀n h t.
      TAKE (NUMERAL (BIT1 n)) (h::t) = h::TAKE (NUMERAL (BIT1 n) − 1) t) ∧
   ∀n h t. TAKE (NUMERAL (BIT2 n)) (h::t) = h::TAKE (NUMERAL (BIT1 n)) t
DROP_compute
|- (∀l. DROP 0 l = l) ∧ (∀n. DROP (NUMERAL (BIT1 n)) [] = []) ∧
   (∀n. DROP (NUMERAL (BIT2 n)) [] = []) ∧
   (∀n h t. DROP (NUMERAL (BIT1 n)) (h::t) = DROP (NUMERAL (BIT1 n) − 1) t) ∧
   ∀n h t. DROP (NUMERAL (BIT2 n)) (h::t) = DROP (NUMERAL (BIT1 n)) t