Theory: llist

Parents


Types


Constants


Definitions

firstPelemAt
|- !P n ll.
     firstPelemAt P n ll =
     option_case F P (LNTH n ll) /\
     !m. m < n ==> (option_APPLY P (LNTH m ll) = SOME F)
fromList
|- (fromList [] = LNIL) /\ !h t. fromList (h::t) = LCONS h (fromList t)
LAPPEND
|- (!x. LAPPEND LNIL x = x) /\
   !h t x. LAPPEND (LCONS h t) x = LCONS h (LAPPEND t x)
lbuild_rep
|- !f x.
     lbuild_rep f x =
     (\pfx.
        option_case NONE
          (\(pfx',nthseed).
             (if pfx' = pfx then option_APPLY SND (f nthseed) else NONE))
          (lbuildn_rep f x (LENGTH pfx)))
lbuildn_rep
|- (!f x. lbuildn_rep f x 0 = SOME ([],x)) /\
   !f x n.
     lbuildn_rep f x (SUC n) =
     option_case NONE
       (\(pfx,x').
          option_case NONE (\(x'',last). SOME (APPEND pfx [last],x'')) (f x'))
       (lbuildn_rep f x n)
LCONS
|- !h t. LCONS h t = llist_abs (lcons_rep h (llist_rep t))
lcons_rep
|- !h t.
     lcons_rep h t =
     (\l. (if l = [] then SOME h else (if HD l = h then t (TL l) else NONE)))
LDEST
|- !ll.
     LDEST ll =
     option_case NONE (\p. SOME (FST p,llist_abs (SND p)))
       (ldest_rep (llist_rep ll))
ldest_rep
|- !f. ldest_rep f = option_case NONE (\x. SOME (x,(\l. f (x::l)))) (f [])
LDROP
|- (!ll. LDROP 0 ll = SOME ll) /\
   !n ll. LDROP (SUC n) ll = option_JOIN (option_APPLY (LDROP n) (LTL ll))
LFILTER
|- !P ll.
     LFILTER P ll =
     (if never P ll then
        LNIL
      else
        (if P (THE (LHD ll)) then
           LCONS (THE (LHD ll)) (LFILTER P (THE (LTL ll)))
         else
           LFILTER P (THE (LTL ll))))
LFINITE
|- !ll. LFINITE ll = ?n. LTAKE n ll = NONE
LFLATTEN
|- !ll.
     LFLATTEN ll =
     (if LL_ALL ($= LNIL) ll then
        LNIL
      else
        (if THE (LHD ll) = LNIL then
           LFLATTEN (THE (LTL ll))
         else
           LCONS (THE (LHD (THE (LHD ll))))
             (LFLATTEN (LCONS (THE (LTL (THE (LHD ll)))) (THE (LTL ll))))))
LHD
|- !ll. LHD ll = option_APPLY FST (ldest_rep (llist_rep ll))
LL_ALL
|- !P ll. LL_ALL P ll = never ($~ o P) ll
LLENGTH
|- !ll.
     LLENGTH ll =
     (if LFINITE ll then
        SOME
          ((@n.
              (LTAKE n ll = NONE) /\
              !m. m < n ==> ?ll'. LTAKE m ll = SOME ll') - 1)
      else
        NONE)
llist_absrep
|- (!a. llist_abs (llist_rep a) = a) /\
   !r. lrep_ok r = (llist_rep (llist_abs r) = r)
llist_TY_DEF
|- ?rep. TYPE_DEFINITION lrep_ok rep
LMAP
|- (!f. LMAP f LNIL = LNIL) /\
   !f h t. LMAP f (LCONS h t) = LCONS (f h) (LMAP f t)
LNIL
|- LNIL = llist_abs lnil_rep
lnil_rep
|- lnil_rep = (\l. NONE)
LNTH
|- (!ll. LNTH 0 ll = LHD ll) /\
   !n ll. LNTH (SUC n) ll = option_JOIN (option_APPLY (LNTH n) (LTL ll))
lrep_ok
|- !f. lrep_ok f = !l x. (f l = SOME x) ==> ?n. lrep_take f n = SOME l
lrep_take
|- (!f. lrep_take f 0 = SOME []) /\
   !f n.
     lrep_take f (SUC n) =
     option_case NONE
       (\pfx. option_case NONE (\a. SOME (APPEND pfx [a])) (f pfx))
       (lrep_take f n)
LTAKE
|- (!ll. LTAKE 0 ll = SOME []) /\
   !n ll.
     LTAKE (SUC n) ll =
     option_case NONE
       (\hd. option_case NONE (\tl. SOME (hd::tl)) (LTAKE n (THE (LTL ll))))
       (LHD ll)
LTL
|- !ll. LTL ll = option_APPLY (llist_abs o SND) (ldest_rep (llist_rep ll))
never
|- !P ll. never P ll = !n. ~firstPelemAt P n ll
toList
|- !ll. toList ll = (if LFINITE ll then LTAKE (THE (LLENGTH ll)) ll else NONE)

Theorems

firstPelemAt_CONS
|- !P n h t.
     firstPelemAt P n (LCONS h t) =
     (n = 0) /\ P h \/ ?m. (n = SUC m) /\ firstPelemAt P m t /\ ~P h
firstPelemAt_SUC
|- !P n h t. firstPelemAt P (SUC n) (LCONS h t) ==> firstPelemAt P n t
from_toList
|- !l. toList (fromList l) = SOME l
LAPPEND_ASSOC
|- !ll1 ll2 ll3. LAPPEND (LAPPEND ll1 ll2) ll3 = LAPPEND ll1 (LAPPEND ll2 ll3)
LAPPEND_NIL_2ND
|- !ll. LAPPEND ll LNIL = ll
LCONS_11
|- !h1 t1 h2 t2. (LCONS h1 t1 = LCONS h2 t2) = (h1 = h2) /\ (t1 = t2)
LCONS_NOT_NIL
|- !h t. ~(LCONS h t = LNIL) /\ ~(LNIL = LCONS h t)
LDROP1_THM
|- LDROP 1 = LTL
LDROP_THM
|- (!ll. LDROP 0 ll = SOME ll) /\ (!n. LDROP (SUC n) LNIL = NONE) /\
   !n h t. LDROP (SUC n) (LCONS h t) = LDROP n t
LFILTER_APPEND
|- !P ll1 ll2.
     LFINITE ll1 ==>
     (LFILTER P (LAPPEND ll1 ll2) = LAPPEND (LFILTER P ll1) (LFILTER P ll2))
LFILTER_NIL
|- !P ll. LL_ALL ($~ o P) ll ==> (LFILTER P ll = LNIL)
LFILTER_THM
|- (!P. LFILTER P LNIL = LNIL) /\
   !P h t.
     LFILTER P (LCONS h t) =
     (if P h then LCONS h (LFILTER P t) else LFILTER P t)
LFINITE_APPEND
|- !ll1 ll2. LFINITE (LAPPEND ll1 ll2) = LFINITE ll1 /\ LFINITE ll2
LFINITE_DROP
|- !n ll. LFINITE ll /\ n <= THE (LLENGTH ll) ==> ?y. LDROP n ll = SOME y
LFINITE_fromList
|- !l. LFINITE (fromList l)
LFINITE_HAS_LENGTH
|- !ll. LFINITE ll ==> ?n. LLENGTH ll = SOME n
LFINITE_INDUCTION
|- !P. P LNIL /\ (!t. P t ==> !h. P (LCONS h t)) ==> !ll. LFINITE ll ==> P ll
LFINITE_MAP
|- !f ll. LFINITE (LMAP f ll) = LFINITE ll
LFINITE_STRONG_INDUCTION
|- P LNIL /\ (!t. LFINITE t /\ P t ==> !h. P (LCONS h t)) ==>
   !ll. LFINITE ll ==> P ll
LFINITE_TAKE
|- !n ll. LFINITE ll /\ n <= THE (LLENGTH ll) ==> ?y. LTAKE n ll = SOME y
LFINITE_THM
|- (LFINITE LNIL = T) /\ !h t. LFINITE (LCONS h t) = LFINITE t
LFINITE_toList
|- !ll. LFINITE ll ==> ?l. toList ll = SOME l
LFLATTEN_APPEND
|- !h t. LFLATTEN (LCONS h t) = LAPPEND h (LFLATTEN t)
LFLATTEN_EQ_NIL
|- !ll. (LFLATTEN ll = LNIL) = LL_ALL ($= LNIL) ll
LFLATTEN_SINGLETON
|- !h. LFLATTEN (LCONS h LNIL) = h
LFLATTEN_THM
|- (LFLATTEN LNIL = LNIL) /\ (!tl. LFLATTEN (LCONS LNIL t) = LFLATTEN t) /\
   !h t tl. LFLATTEN (LCONS (LCONS h t) tl) = LCONS h (LFLATTEN (LCONS t tl))
LHD_EQ_NONE
|- !ll. (LHD ll = NONE) = (ll = LNIL)
LHD_THM
|- (LHD LNIL = NONE) /\ !h t. LHD (LCONS h t) = SOME h
LHDTL_CONS_THM
|- !h t. (LHD (LCONS h t) = SOME h) /\ (LTL (LCONS h t) = SOME t)
LHDTL_EQ_SOME
|- !h t ll. (ll = LCONS h t) = (LHD ll = SOME h) /\ (LTL ll = SOME t)
LL_ALL_THM
|- (!P. LL_ALL P LNIL = T) /\ !P h t. LL_ALL P (LCONS h t) = P h /\ LL_ALL P t
LLENGTH_APPEND
|- !ll1 ll2.
     LLENGTH (LAPPEND ll1 ll2) =
     (if LFINITE ll1 /\ LFINITE ll2 then
        SOME (THE (LLENGTH ll1) + THE (LLENGTH ll2))
      else
        NONE)
LLENGTH_fromList
|- !l. LLENGTH (fromList l) = SOME (LENGTH l)
LLENGTH_MAP
|- !ll f. LLENGTH (LMAP f ll) = LLENGTH ll
LLENGTH_THM
|- (LLENGTH LNIL = SOME 0) /\
   !h t. LLENGTH (LCONS h t) = option_APPLY SUC (LLENGTH t)
llist_Axiom
|- !f.
     ?g.
       (!x. LHD (g x) = option_APPLY SND (f x)) /\
       !x. LTL (g x) = option_APPLY (g o FST) (f x)
LLIST_BISIMULATION
|- !ll1 ll2.
     (ll1 = ll2) =
     ?R.
       R ll1 ll2 /\
       !ll3 ll4.
         R ll3 ll4 ==>
         (ll3 = LNIL) /\ (ll4 = LNIL) \/
         (LHD ll3 = LHD ll4) /\ R (THE (LTL ll3)) (THE (LTL ll4))
llist_CASES
|- !l. (l = LNIL) \/ ?h t. l = LCONS h t
LMAP_APPEND
|- !f ll1 ll2. LMAP f (LAPPEND ll1 ll2) = LAPPEND (LMAP f ll1) (LMAP f ll2)
LMAP_MAP
|- !f g ll. LMAP f (LMAP g ll) = LMAP (f o g) ll
LNTH_THM
|- (!n. LNTH n LNIL = NONE) /\ (!h t. LNTH 0 (LCONS h t) = SOME h) /\
   !n h t. LNTH (SUC n) (LCONS h t) = LNTH n t
LTAKE_CONS_EQ_NONE
|- !m h t.
     (LTAKE m (LCONS h t) = NONE) = ?n. (m = SUC n) /\ (LTAKE n t = NONE)
LTAKE_CONS_EQ_SOME
|- !m h t l.
     (LTAKE m (LCONS h t) = SOME l) =
     (m = 0) /\ (l = []) \/
     ?n l'. (m = SUC n) /\ (LTAKE n t = SOME l') /\ (l = h::l')
LTAKE_DROP
|- (!n ll.
      ~LFINITE ll ==>
      (LAPPEND (fromList (THE (LTAKE n ll))) (THE (LDROP n ll)) = ll)) /\
   !n ll.
     LFINITE ll /\ n <= THE (LLENGTH ll) ==>
     (LAPPEND (fromList (THE (LTAKE n ll))) (THE (LDROP n ll)) = ll)
LTAKE_EQ
|- !ll1 ll2. (ll1 = ll2) = !n. LTAKE n ll1 = LTAKE n ll2
LTAKE_EQ_NONE
|- !ll n. (LTAKE n ll = NONE) ==> 0 < n
LTAKE_EQ_SOME_CONS
|- !n l x. (LTAKE n l = SOME x) ==> !h. ?y. LTAKE n (LCONS h l) = SOME y
LTAKE_fromList
|- !l. LTAKE (LENGTH l) (fromList l) = SOME l
LTAKE_NIL_EQ_NONE
|- !m. (LTAKE m LNIL = NONE) = 0 < m
LTAKE_NIL_EQ_SOME
|- !l m. (LTAKE m LNIL = SOME l) = (m = 0) /\ (l = [])
LTAKE_THM
|- (!l. LTAKE 0 l = SOME []) /\ (!n. LTAKE (SUC n) LNIL = NONE) /\
   !n h t. LTAKE (SUC n) (LCONS h t) = option_APPLY (CONS h) (LTAKE n t)
LTL_EQ_NONE
|- !ll. (LTL ll = NONE) = (ll = LNIL)
LTL_THM
|- (LTL LNIL = NONE) /\ !h t. LTL (LCONS h t) = SOME t
never_THM
|- (!P. never P LNIL = T) /\ !P h t. never P (LCONS h t) = ~P h /\ never P t
NOT_LFINITE_APPEND
|- !ll1 ll2. ~LFINITE ll1 ==> (LAPPEND ll1 ll2 = ll1)
NOT_LFINITE_DROP
|- !ll. ~LFINITE ll ==> !n. ?y. LDROP n ll = SOME y
NOT_LFINITE_NO_LENGTH
|- !ll. ~LFINITE ll ==> (LLENGTH ll = NONE)
NOT_LFINITE_TAKE
|- !ll. ~LFINITE ll ==> !n. ?y. LTAKE n ll = SOME y
to_fromList
|- !ll. LFINITE ll ==> (fromList (THE (toList ll)) = ll)
toList_THM
|- (toList LNIL = SOME []) /\
   !h t. toList (LCONS h t) = option_APPLY (CONS h) (toList t)