- BIND_DEF
-
⊢ ∀g f. monad_bind g f = fᴾ ∘ g
- EXT_DEF
-
⊢ ∀f m. EXT f m = fᴾ ∘ m
- FOREACH_primitive_def
-
⊢ FOREACH =
WFREC (@R. WF R ∧ ∀h a t. R (t,a) (h::t,a))
(λFOREACH a'.
case a' of
([],a) => I (UNIT ())
| (h::t,a) => I do u <- a h; FOREACH (t,a) od)
- FOR_primitive_def
-
⊢ FOR =
WFREC
(@R. WF R ∧ ∀a j i. i ≠ j ⇒ R (if i < j then i + 1 else i − 1,j,a) (i,j,a))
(λFOR a'.
case a' of
(i,j,a) =>
I
(if i = j then a i
else do u <- a i; FOR (if i < j then i + 1 else i − 1,j,a) od))
- IGNORE_BIND_DEF
-
⊢ ∀f g. do f; g od = do x <- f; g od
- JOIN_DEF
-
⊢ ∀z. JOIN z = monad_bind z I
- MCOMP_DEF
-
⊢ ∀g f. MCOMP g f = EXT g ∘ f
- MMAP_DEF
-
⊢ ∀f m. MMAP f m = monad_bind m (UNIT ∘ f)
- MWHILE_DEF
-
⊢ ∀g b.
MWHILE g b = do gv <- g; if gv then do b; MWHILE g b od else UNIT () od
- NARROW_def
-
⊢ ∀v f. NARROW v f = (λs. (let (r,s1) = f (v,s) in (r,SND s1)))
- READ_def
-
⊢ ∀f. READ f = (λs. (f s,s))
- UNIT_DEF
-
⊢ ∀x. UNIT x = (λs. (x,s))
- WIDEN_def
-
⊢ ∀f. WIDEN f = (λ(s1,s2). (let (r,s3) = f s2 in (r,s1,s3)))
- WRITE_def
-
⊢ ∀f. WRITE f = (λs. ((),f s))
- mapM_def
-
⊢ ∀f. mapM f = sequence ∘ MAP f
- sequence_def
-
⊢ sequence = FOLDR (λm ms. do x <- m; xs <- ms; UNIT (x::xs) od) (UNIT [])
- BIND_ASSOC
-
⊢ ∀k m n. do a <- k; monad_bind (m a) n od = monad_bind (monad_bind k m) n
- BIND_EXT
-
⊢ monad_bind m f = EXT f m
- BIND_LEFT_UNIT
-
⊢ ∀k x. monad_bind (UNIT x) k = k x
- BIND_RIGHT_UNIT
-
⊢ ∀k. monad_bind k UNIT = k
- EXT_JM
-
⊢ EXT f = JOIN ∘ MMAP f
- EXT_MCOMP
-
⊢ EXT (MCOMP g f) = EXT g ∘ EXT f
- EXT_UNIT
-
⊢ EXT UNIT = I
- EXT_o_JOIN
-
⊢ ∀f. EXT f ∘ JOIN = EXT (EXT f)
- EXT_o_UNIT
-
⊢ EXT f ∘ UNIT = f
- FOREACH_def
-
⊢ (∀a. FOREACH ([],a) = UNIT ()) ∧
∀t h a. FOREACH (h::t,a) = do u <- a h; FOREACH (t,a) od
- FOREACH_ind
-
⊢ ∀P. (∀a. P ([],a)) ∧ (∀h t a. P (t,a) ⇒ P (h::t,a)) ⇒ ∀v v1. P (v,v1)
- FOR_def
-
⊢ ∀j i a.
FOR (i,j,a) =
if i = j then a i
else do u <- a i; FOR (if i < j then i + 1 else i − 1,j,a) od
- FOR_ind
-
⊢ ∀P. (∀i j a. (i ≠ j ⇒ P (if i < j then i + 1 else i − 1,j,a)) ⇒ P (i,j,a)) ⇒
∀v v1 v2. P (v,v1,v2)
- FST_o_MMAP
-
⊢ ∀f g. FST ∘ MMAP f g = f ∘ FST ∘ g
- FST_o_UNIT
-
⊢ ∀x. FST ∘ UNIT x = K x
- JOIN_EXT
-
⊢ JOIN = EXT I
- JOIN_MAP
-
⊢ ∀k m. monad_bind k m = JOIN (MMAP m k)
- JOIN_MAP_JOIN
-
⊢ JOIN ∘ MMAP JOIN = JOIN ∘ JOIN
- JOIN_MMAP_UNIT
-
⊢ JOIN ∘ MMAP UNIT = I
- JOIN_UNIT
-
⊢ JOIN ∘ UNIT = I
- MCOMP_ALT
-
⊢ MCOMP g f = CURRY (gᴾ ∘ fᴾ)
- MCOMP_ASSOC
-
⊢ MCOMP f (MCOMP g h) = MCOMP (MCOMP f g) h
- MCOMP_ID
-
⊢ (MCOMP g UNIT = g) ∧ (MCOMP UNIT f = f)
- MMAP_COMP
-
⊢ ∀f g. MMAP (f ∘ g) = MMAP f ∘ MMAP g
- MMAP_EXT
-
⊢ MMAP f = EXT (UNIT ∘ f)
- MMAP_ID
-
⊢ MMAP I = I
- MMAP_JOIN
-
⊢ ∀f. MMAP f ∘ JOIN = JOIN ∘ MMAP (MMAP f)
- MMAP_UNIT
-
⊢ ∀f. MMAP f ∘ UNIT = UNIT ∘ f
- SND_o_UNIT
-
⊢ ∀x. SND ∘ UNIT x = I
- UNIT_CURRY
-
⊢ UNIT = CURRY I
- UNIT_UNCURRY
-
⊢ ∀s. UNITᴾ s = s
- UNIT_o_MCOMP
-
⊢ MCOMP (UNIT ∘ g) (UNIT ∘ f) = UNIT ∘ g ∘ f
- mapM_cons
-
⊢ mapM f (x::xs) = do y <- f x; ys <- mapM f xs; UNIT (y::ys) od
- mapM_nil
-
⊢ mapM f [] = UNIT []
- sequence_nil
-
⊢ sequence [] = UNIT []