Package hol-quotient: HOL quotient theories

Information

namehol-quotient
version1.1
descriptionHOL quotient theories
authorHOL OpenTheory Packager <opentheory-packager@hol-theorem-prover.org>
licenseMIT
checksum4d22445a191fc3d1b6250422a88ce83e01eed04b
requiresbase
hol-base
hol-res-quan
showData.Bool
Data.List
Data.Option
Data.Pair
Function
HOL4
Number.Natural
Relation

Files

Defined Constants

Theorems

quotient.EQUIV (=)

quotient.respects = Combinator.w

map id = id

map id = id

list.LIST_REL (=) = (=)

option.OPTREL (=) = (=)

quotient.QUOTIENT (=) id id

R. quotient_pred_set.FINITER R pred_set.EMPTY

quotient.--> id id = id

pair.## id id = id

quotient.===> (=) (=) = (=)

quotient_pair.### (=) (=) = (=)

quotient_sum.+++ (=) (=) = (=)

P. quotient.?!! P (∃!) P

R. quotient.EQUIV R quotient.PARTIAL_EQUIV R

R. quotient.EQUIV R quotient.EQUIV (list.LIST_REL R)

R. quotient.EQUIV R quotient.EQUIV (option.OPTREL R)

P Q. (P Q) P Q

R x. quotient.respects R x R x x

R x. bool.IN x (quotient.respects R) R x x

R P.
    bool.RES_EXISTS_UNIQUE (quotient.respects R) P
    quotient.RES_EXISTS_EQUIV R P

P Q. (Q P) ¬P ¬Q

f g. quotient.--> f g = λh x. g (h (f x))

E P.
    quotient.EQUIV E (bool.RES_EXISTS (quotient.respects E) P () P)

E P.
    quotient.EQUIV E
    (bool.RES_EXISTS_UNIQUE (quotient.respects E) P (∃!) P)

E P.
    quotient.EQUIV E (bool.RES_FORALL (quotient.respects E) P () P)

R1 R2.
    quotient.EQUIV R1 quotient.EQUIV R2
    quotient.EQUIV (quotient_pair.### R1 R2)

R1 R2.
    quotient.EQUIV R1 quotient.EQUIV R2
    quotient.EQUIV (quotient_sum.+++ R1 R2)

R abs rep. quotient.QUOTIENT R abs rep list.LIST_REL R [] []

R abs rep. quotient.QUOTIENT R abs rep option.OPTREL R none none

R abs rep. quotient.QUOTIENT R abs rep [] = map abs []

R abs rep. quotient.QUOTIENT R abs rep none = map abs none

R abs rep.
    quotient.QUOTIENT R abs rep
    quotient.===> R () pred_set.EMPTY pred_set.EMPTY

R abs rep.
    quotient.QUOTIENT R abs rep
    quotient.===> R () pred_set.UNIV pred_set.UNIV

f s x. bool.IN x (quotient.--> f id s) bool.IN (f x) s

P Q. (x. P x Q x) () P () Q

P Q. (x. P x Q x) () P () Q

R abs rep.
    quotient.QUOTIENT R abs rep
    pred_set.EMPTY = quotient.--> rep id pred_set.EMPTY

R abs rep.
    quotient.QUOTIENT R abs rep
    pred_set.UNIV = quotient.--> rep id pred_set.UNIV

f g h x. quotient.--> f g h x = g (h (f x))

R abs rep. quotient.QUOTIENT R abs rep a. R (rep a) (rep a)

R abs rep. quotient.QUOTIENT R abs rep a. abs (rep a) = a

R abs rep.
    quotient.QUOTIENT R abs rep
    quotient.QUOTIENT (list.LIST_REL R) (map abs) (map rep)

R abs rep.
    quotient.QUOTIENT R abs rep
    quotient.QUOTIENT (option.OPTREL R) (map abs) (map rep)

E. quotient.EQUIV E x y. E x y E x = E y

r lam v.
    bool.IN v r bool.LET (bool.RES_ABSTRACT r lam) v = bool.LET lam v

R s1 s2.
    quotient.===> R () s1 s2
    (quotient_pred_set.FINITER R s1 quotient_pred_set.FINITER R s2)

f g s x. bool.IN x (quotient.--> f g s) g (bool.IN (f x) s)

R abs rep. quotient.QUOTIENT R abs rep e. id e = abs (id (rep e))

R abs rep. quotient.QUOTIENT R abs rep l. null l null (map rep l)

R abs rep.
    quotient.QUOTIENT R abs rep l. length l = length (map rep l)

R abs rep.
    quotient.QUOTIENT R abs rep x. isNone x isNone (map rep x)

R abs rep.
    quotient.QUOTIENT R abs rep x. isSome x isSome (map rep x)

R1 R2.
    quotient_pair.### R1 R2 =
    pair.UNCURRY (λa b. pair.UNCURRY (λc d. R1 a c R2 b d))

R P Q.
    quotient.===> R () P Q
    bool.RES_EXISTS_UNIQUE (quotient.respects R) P
    quotient.RES_EXISTS_EQUIV R Q

R abs rep.
    quotient.QUOTIENT R abs rep x. some x = map abs (some (rep x))

R abs rep. quotient.QUOTIENT R abs rep x y. R x y R y x

R. quotient.EQUIV R R a1 a2 R b1 b2 a1 = b1 R a2 b2

R x s y.
    bool.IN y (quotient_pred_set.INSERTR R x s) R y x bool.IN y s

R x s.
    quotient_pred_set.INSERTR R x s =
    pred_set.GSPEC (λy. (y, R y x bool.IN y s))

R abs rep. quotient.QUOTIENT R abs rep r. R r r R (rep (abs r)) r

R abs rep.
    quotient.QUOTIENT R abs rep
    l. reverse l = map abs (reverse (map rep l))

R abs rep.
    quotient.QUOTIENT R abs rep
    f. (∃!) f quotient.RES_EXISTS_EQUIV R (quotient.--> abs id f)

R abs rep.
    quotient.QUOTIENT R abs rep
    s.
      pred_set.FINITE s
      quotient_pred_set.FINITER R (quotient.--> abs id s)

R s t.
    quotient_pred_set.SUBSETR R s t
    bool.RES_FORALL (quotient.respects R) (λx. bool.IN x s bool.IN x t)

x x1 x2 x3.
    quotient_sum.+++ x x1 x2 x3
    quotient_sum.SUM_REL_tupled (x, x1, x2, x3)

R. (x y. R x y R x = R y) x. list.LIST_REL R x x

R s t.
    quotient_pred_set.PSUBSETR R s t
    quotient_pred_set.SUBSETR R s t ¬quotient.===> R () s t

R.
    bool.RES_FORALL (quotient.respects (quotient.===> R ()))
      (λs.
         quotient_pred_set.FINITER R s
         bool.RES_FORALL (quotient.respects R)
           (λx.
              quotient_pred_set.FINITER R
                (quotient_pred_set.INSERTR R x s)))

P P' Q Q'. P = Q P' = Q' P = P' Q = Q'

P P' Q Q'. (P Q) (P' Q') P P' Q Q'

P P' Q Q'. (P Q) (P' Q') P P' Q Q'

P P' Q Q'. (Q P) (P' Q') (P P') Q Q'

P R Q. (x. R x (P x Q x)) () P bool.RES_EXISTS R Q

P R Q. (x. R x (Q x P x)) bool.RES_FORALL R Q () P

P R Q. (x. R x P x Q x) () P bool.RES_FORALL R Q

P R Q. (x. R x Q x P x) bool.RES_EXISTS R Q () P

R abs rep.
    quotient.QUOTIENT R abs rep
    f.
      () f bool.RES_FORALL (quotient.respects R) (quotient.--> abs id f)

R abs rep.
    quotient.QUOTIENT R abs rep
    f.
      () f bool.RES_EXISTS (quotient.respects R) (quotient.--> abs id f)

R abs rep.
    quotient.QUOTIENT R abs rep
    l. concat l = map abs (concat (map (map rep) l))

R s x y.
    bool.IN y (quotient_pred_set.DELETER R s x) bool.IN y s ¬R x y

R s x.
    quotient_pred_set.DELETER R s x =
    pred_set.GSPEC (λy. (y, bool.IN y s ¬R x y))

R s t.
    quotient_pred_set.DISJOINTR R s t
    ¬bool.RES_EXISTS (quotient.respects R) (λx. bool.IN x s bool.IN x t)

REL abs rep.
    quotient.QUOTIENT REL abs rep
    x1 x2. REL x1 x2 REL x1 (rep (abs x2))

R abs rep. quotient.QUOTIENT R abs rep r s. R r s abs r = abs s

R abs rep.
    quotient.QUOTIENT R abs rep e1 e2. R e1 e2 R (id e1) (id e2)

R abs rep. quotient.QUOTIENT R abs rep x y. x = y R (rep x) (rep y)

R abs rep. quotient.QUOTIENT R abs rep a b. R (rep a) (rep b) a = b

P Q R. (x. R x P x Q x) bool.RES_EXISTS R P bool.RES_EXISTS R Q

P Q R. (x. R x P x Q x) bool.RES_FORALL R P bool.RES_FORALL R Q

R abs rep.
    quotient.QUOTIENT R abs rep
    x y. R x y option.OPTREL R (some x) (some y)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2. list.LIST_REL R l1 l2 (null l1 null l2)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2. list.LIST_REL R l1 l2 length l1 = length l2

R abs rep.
    quotient.QUOTIENT R abs rep
    x y. option.OPTREL R x y (isNone x isNone y)

R abs rep.
    quotient.QUOTIENT R abs rep
    x y. option.OPTREL R x y (isSome x isSome y)

R1 R2 f x y.
    quotient.respects (quotient.===> R1 R2) f R1 x y R2 (f x) (f y)

R1 R2 f.
    quotient.respects (quotient.===> R1 R2) f
    x y. R1 x y R2 (f x) (f y)

R.
    bool.RES_FORALL (quotient.respects R)
      (λx.
         bool.RES_FORALL (quotient.respects (quotient.===> R ()))
           (λs.
              bool.IN x s
              quotient.===> R () (quotient_pred_set.INSERTR R x s) s))

R abs rep.
    quotient.QUOTIENT R abs rep
    x s. bool.IN x s bool.IN (rep x) (quotient.--> abs id s)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2.
      list.LIST_REL R l1 l2 list.LIST_REL R (reverse l1) (reverse l2)

R1 R2 f v.
    quotient_pred_set.GSPECR R1 R2 f v
    bool.RES_EXISTS (quotient.respects R1)
      (λx. quotient_pair.### R2 () (v, ) (f x))

R1 R2 f g. quotient.===> R1 R2 f g x y. R1 x y R2 (f x) (g y)

R abs rep.
    quotient.QUOTIENT R abs rep
    t h. h :: t = map abs (rep h :: map rep t)

R abs rep.
    quotient.QUOTIENT R abs rep
    l P. all P l all (quotient.--> abs id P) (map rep l)

R abs rep.
    quotient.QUOTIENT R abs rep
    l P. any P l any (quotient.--> abs id P) (map rep l)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2.
      list.LIST_REL (list.LIST_REL R) l1 l2
      list.LIST_REL R (concat l1) (concat l2)

R s t.
    quotient.===> R () s t x y. R x y (bool.IN x s bool.IN y t)

R1 R2 f v.
    bool.IN v (quotient_pred_set.GSPECR R1 R2 f)
    bool.RES_EXISTS (quotient.respects R1)
      (λx. quotient_pair.### R2 () (v, ) (f x))

R abs rep. quotient.QUOTIENT R abs rep x y z. R x y R y z R x z

R abs rep.
    quotient.QUOTIENT R abs rep
    l m. l @ m = map abs (map rep l @ map rep m)

R abs rep.
    quotient.QUOTIENT R abs rep
    f g.
      quotient.===> R () f g
      (quotient.RES_EXISTS_EQUIV R f quotient.RES_EXISTS_EQUIV R g)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2.
      quotient.===> R () s1 s2
      (quotient_pred_set.FINITER R s1 quotient_pred_set.FINITER R s2)

R abs rep.
    quotient.QUOTIENT R abs rep
    P f.
      bool.RES_EXISTS P f
      bool.RES_EXISTS (quotient.--> abs id P) (quotient.--> abs id f)

R abs rep.
    quotient.QUOTIENT R abs rep
    P f.
      bool.RES_FORALL P f
      bool.RES_FORALL (quotient.--> abs id P) (quotient.--> abs id f)

quotient.RES_EXISTS_EQUIV =
  λR P.
    bool.RES_EXISTS (quotient.respects R) (λx. P x)
    bool.RES_FORALL (quotient.respects R)
      (λx. bool.RES_FORALL (quotient.respects R) (λy. P x P y R x y))

R abs rep.
    quotient.QUOTIENT R abs rep
    a b c. (if a then b else c) = abs (if a then rep b else rep c)

R1 R2 a b c d. quotient_pair.### R1 R2 (a, b) (c, d) R1 a c R2 b d

R abs rep.
    quotient.QUOTIENT R abs rep
    P l. filter P l = map abs (filter (quotient.--> abs id P) (map rep l))

R abs rep.
    quotient.QUOTIENT R abs rep
    s t.
      pred_set.DISJOINT s t
      quotient_pred_set.DISJOINTR R (quotient.--> abs id s)
        (quotient.--> abs id t)

R abs rep.
    quotient.QUOTIENT R abs rep
    s t.
      pred_set.PSUBSET s t
      quotient_pred_set.PSUBSETR R (quotient.--> abs id s)
        (quotient.--> abs id t)

R abs rep.
    quotient.QUOTIENT R abs rep
    s t.
      pred_set.SUBSET s t
      quotient_pred_set.SUBSETR R (quotient.--> abs id s)
        (quotient.--> abs id t)

R1 R2 R3 f g.
    quotient.respects (quotient.===> R2 R3) f
    quotient.respects (quotient.===> R1 R2) g
    quotient.respects (quotient.===> R1 R3) (f g)

R1 R2 y f s.
    bool.IN y (quotient_pred_set.IMAGER R1 R2 f s)
    bool.RES_EXISTS (quotient.respects R1) (λx. R2 y (f x) bool.IN x s)

R1 R2 f1 f2 x1 x2.
    R2 (f1 x1) (f2 x2) R1 x1 x1
    R2 (bool.RES_ABSTRACT (quotient.respects R1) f1 x1) (f2 x2)

R1 R2 f1 f2 x1 x2.
    R2 (f1 x1) (f2 x2) R1 x2 x2
    R2 (f1 x1) (bool.RES_ABSTRACT (quotient.respects R1) f2 x2)

R1 R2 f s.
    quotient_pred_set.IMAGER R1 R2 f s =
    pred_set.GSPEC
      (λy.
         (y,
          bool.RES_EXISTS (quotient.respects R1)
            (λx. R2 y (f x) bool.IN x s)))

R abs rep.
    quotient.QUOTIENT R abs rep
    f g.
      quotient.===> R () f g
      (bool.RES_EXISTS (quotient.respects R) f
       bool.RES_EXISTS (quotient.respects R) g)

R abs rep.
    quotient.QUOTIENT R abs rep
    f g.
      quotient.===> R () f g
      (bool.RES_FORALL (quotient.respects R) f
       bool.RES_FORALL (quotient.respects R) g)

R abs rep.
    quotient.QUOTIENT R abs rep
    s x.
      pred_set.DELETE s x =
      quotient.--> rep id
        (quotient_pred_set.DELETER R (quotient.--> abs id s) (rep x))

R abs rep.
    quotient.QUOTIENT R abs rep
    s x.
      pred_set.INSERT x s =
      quotient.--> rep id
        (quotient_pred_set.INSERTR R (rep x) (quotient.--> abs id s))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 f g.
      quotient.===> R1 R2 f g
      quotient.===> R1 R2 f (bool.RES_ABSTRACT (quotient.respects R1) g)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 f g.
      quotient.===> R1 R2 f g
      quotient.===> R1 R2 (bool.RES_ABSTRACT (quotient.respects R1) f) g

R abs rep.
    quotient.QUOTIENT R abs rep
    s t.
      pred_set.DIFF s t =
      quotient.--> rep id
        (pred_set.DIFF (quotient.--> abs id s) (quotient.--> abs id t))

R abs rep.
    quotient.QUOTIENT R abs rep
    s t.
      pred_set.INTER s t =
      quotient.--> rep id
        (pred_set.INTER (quotient.--> abs id s) (quotient.--> abs id t))

R abs rep.
    quotient.QUOTIENT R abs rep
    s t.
      pred_set.UNION s t =
      quotient.--> rep id
        (pred_set.UNION (quotient.--> abs id s) (quotient.--> abs id t))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a. Data.Sum.isLeft a Data.Sum.isLeft (sum.++ rep1 rep2 a)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a. Data.Sum.isRight a Data.Sum.isRight (sum.++ rep1 rep2 a)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      quotient.QUOTIENT (quotient.===> R1 R2) (quotient.--> rep1 abs2)
        (quotient.--> abs1 rep2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      quotient.QUOTIENT (quotient_pair.### R1 R2) (pair.## abs1 abs2)
        (pair.## rep1 rep2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      quotient.QUOTIENT (quotient_sum.+++ R1 R2) (sum.++ abs1 abs2)
        (sum.++ rep1 rep2)

R abs rep.
    quotient.QUOTIENT R abs rep
    r s. R r s R r r R s s abs r = abs s

R abs rep.
    quotient.QUOTIENT R abs rep
    r s. R r r R s s (R r s abs r = abs s)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a. Data.Sum.left a = sum.++ abs1 abs2 (Data.Sum.left (rep1 a))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      b. Data.Sum.right b = sum.++ abs1 abs2 (Data.Sum.right (rep2 b))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      p. fst p = abs1 (fst (pair.## rep1 rep2 p))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      p. snd p = abs2 (snd (pair.## rep1 rep2 p))

R m.
    quotient.RES_EXISTS_EQUIV R m
    bool.RES_EXISTS (quotient.respects R) (λx. m x)
    bool.RES_FORALL (quotient.respects R)
      (λx. bool.RES_FORALL (quotient.respects R) (λy. m x m y R x y))

R.
    quotient.PARTIAL_EQUIV R
    (x. R x x) x y. R x y R x x R y y R x = R y

R abs rep.
    quotient.QUOTIENT R abs rep
    x1 x2 y1 y2. R x1 x2 R y1 y2 (R x1 y1 R x2 y2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 f x.
      quotient.respects (quotient.===> R1 R2) f R1 x x
      R2 (f (rep1 (abs1 x))) (f x)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f. (λx. f x) = quotient.--> rep1 abs2 (λx. rep2 (f (abs1 x)))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      x y. const x y = abs1 (const (rep1 x) (rep2 y))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f x. f x = abs2 (quotient.--> abs1 rep2 f (rep1 x))

R abs rep.
    quotient.QUOTIENT R abs rep
    x1 x2 s1 s2.
      R x1 x2 quotient.===> R () s1 s2 (bool.IN x1 s1 bool.IN x2 s2)

R abs rep.
    quotient.QUOTIENT R abs rep
    t1 t2 h1 h2.
      R h1 h2 list.LIST_REL R t1 t2
      list.LIST_REL R (h1 :: t1) (h2 :: t2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s t x y. quotient.===> R () s t R x y (bool.IN x s bool.IN y t)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f.
        f =
        quotient.--> rep1 abs2
          (bool.RES_ABSTRACT (quotient.respects R1)
             (quotient.--> abs1 rep2 f))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f.
        (λx. f x) = quotient.--> rep1 abs2 (λx. quotient.--> abs1 rep2 f x)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a1 a2.
        R1 a1 a2
        quotient_sum.+++ R1 R2 (Data.Sum.left a1) (Data.Sum.left a2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      b1 b2.
        R2 b1 b2
        quotient_sum.+++ R1 R2 (Data.Sum.right b1) (Data.Sum.right b2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      p1 p2. quotient_pair.### R1 R2 p1 p2 R1 (fst p1) (fst p2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      p1 p2. quotient_pair.### R1 R2 p1 p2 R2 (snd p1) (snd p2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a1 a2.
        quotient_sum.+++ R1 R2 a1 a2
        (Data.Sum.isLeft a1 Data.Sum.isLeft a2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a1 a2.
        quotient_sum.+++ R1 R2 a1 a2
        (Data.Sum.isRight a1 Data.Sum.isRight a2)

(option.OPTREL R none none ) (option.OPTREL R (some x) none )
  (option.OPTREL R none (some y) )
  (option.OPTREL R (some x) (some y) R x y)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2 m1 m2.
      list.LIST_REL R l1 l2 list.LIST_REL R m1 m2
      list.LIST_REL R (l1 @ m1) (l2 @ m2)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2 P1 P2.
      quotient.===> R () P1 P2 list.LIST_REL R l1 l2
      (all P1 l1 all P2 l2)

R abs rep.
    quotient.QUOTIENT R abs rep
    l1 l2 P1 P2.
      quotient.===> R () P1 P2 list.LIST_REL R l1 l2
      (any P1 l1 any P2 l2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a b. (a, b) = pair.## abs1 abs2 (rep1 a, rep2 b)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f x.
        bool.literal_case f x =
        abs2 (bool.literal_case (quotient.--> abs1 rep2 f) (rep1 x))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f x.
        bool.LET f x = abs2 (bool.LET (quotient.--> abs1 rep2 f) (rep1 x))

R abs rep.
    quotient.QUOTIENT R abs rep
    r s.
      list.LIST_REL R r s
      list.LIST_REL R r r list.LIST_REL R s s map abs r = map abs s

R abs rep.
    quotient.QUOTIENT R abs rep
    P1 P2 l1 l2.
      quotient.===> R () P1 P2 list.LIST_REL R l1 l2
      list.LIST_REL R (filter P1 l1) (filter P2 l2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f.
        pred_set.GSPEC f =
        quotient.--> rep2 id
          (quotient_pred_set.GSPECR R1 R2
             (quotient.--> abs1 (pair.## rep2 id) f))

R1 R2.
    (x y. R1 x y R1 x = R1 y) (x y. R2 x y R2 x = R2 y)
    x. quotient_pair.### R1 R2 x x

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      l f.
        map f l = map abs2 (map (quotient.--> abs1 rep2 f) (map rep1 l))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a f.
        map f a = map abs2 (map (quotient.--> abs1 rep2 f) (map rep1 a))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f1 f2.
        quotient.===> R1 R2 f1 f2
        quotient.===> R1 R2 (λx. f1 x) (λy. f2 y)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f x.
        Combinator.w f x =
        abs2
          (Combinator.w (quotient.--> abs1 (quotient.--> abs1 rep2) f)
             (rep1 x))

R abs rep.
    quotient.QUOTIENT R abs rep
    x1 x2 s1 s2.
      R x1 x2 quotient.===> R () s1 s2
      quotient.===> R () (quotient_pred_set.INSERTR R x1 s1)
        (quotient_pred_set.INSERTR R x2 s2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 x1 x2.
      quotient.===> R () s1 s2 R x1 x2
      quotient.===> R () (quotient_pred_set.DELETER R s1 x1)
        (quotient_pred_set.DELETER R s2 x2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 t1 t2.
      quotient.===> R () s1 s2 quotient.===> R () t1 t2
      (quotient_pred_set.DISJOINTR R s1 t1
       quotient_pred_set.DISJOINTR R s2 t2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 t1 t2.
      quotient.===> R () s1 s2 quotient.===> R () t1 t2
      (quotient_pred_set.PSUBSETR R s1 t1
       quotient_pred_set.PSUBSETR R s2 t2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 t1 t2.
      quotient.===> R () s1 s2 quotient.===> R () t1 t2
      (quotient_pred_set.SUBSETR R s1 t1
       quotient_pred_set.SUBSETR R s2 t2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 t1 t2.
      quotient.===> R () s1 s2 quotient.===> R () t1 t2
      quotient.===> R () (pred_set.DIFF s1 t1) (pred_set.DIFF s2 t2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 t1 t2.
      quotient.===> R () s1 s2 quotient.===> R () t1 t2
      quotient.===> R () (pred_set.INTER s1 t1) (pred_set.INTER s2 t2)

R abs rep.
    quotient.QUOTIENT R abs rep
    s1 s2 t1 t2.
      quotient.===> R () s1 s2 quotient.===> R () t1 t2
      quotient.===> R () (pred_set.UNION s1 t1) (pred_set.UNION s2 t2)

R s.
    quotient_pred_set.FINITER R s
    bool.RES_FORALL
      (quotient.respects (quotient.===> (quotient.===> R ()) ()))
      (λP.
         P pred_set.EMPTY
         bool.RES_FORALL (quotient.respects (quotient.===> R ()))
           (λs.
              P s
              bool.RES_FORALL (quotient.respects R)
                (λe. P (quotient_pred_set.INSERTR R e s))) P s)

quotient_sum.SUM_REL_tupled =
  relation.WFREC (select R. wellFounded R)
    (λSUM_REL_tupled a.
       pair.pair_CASE a
         (λR1 v1.
            pair.pair_CASE v1
              (λR2 v3.
                 pair.pair_CASE v3
                   (λv4 v5.
                      sum.sum_CASE v4
                        (λa1.
                           sum.sum_CASE v5 (λa2. id (R1 a1 a2))
                             (λb2'. id ))
                        (λb1.
                           sum.sum_CASE v5 (λa2'. id )
                             (λb2. id (R2 b1 b2)))))))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f1 f2.
        quotient.===> R1 R2 f1 f2
        quotient.===> R1 R2 (bool.RES_ABSTRACT (quotient.respects R1) f1)
          (bool.RES_ABSTRACT (quotient.respects R1) f2)

R abs rep.
    quotient.QUOTIENT R abs rep
    a1 a2 b1 b2 c1 c2.
      (a1 a2) R b1 b2 R c1 c2
      R (if a1 then b1 else c1) (if a2 then b2 else c2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      x1 x2 y1 y2. R1 x1 x2 R2 y1 y2 R1 (const x1 y1) (const x2 y2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f g x y. quotient.===> R1 R2 f g R1 x y R2 (f x) (g y)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f s.
        pred_set.IMAGE f s =
        quotient.--> rep2 id
          (quotient_pred_set.IMAGER R1 R2 (quotient.--> abs1 rep2 f)
             (quotient.--> abs1 id s))

P R Q.
    (x. P x Q x)
    (x y.
       quotient.respects R x Q x quotient.respects R y Q y R x y)
    bool.RES_EXISTS_UNIQUE (quotient.respects R) P
    quotient.RES_EXISTS_EQUIV R Q

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f1 f2.
        quotient.===> R1 (quotient_pair.### R2 ()) f1 f2
        quotient.===> R2 () (quotient_pred_set.GSPECR R1 R2 f1)
          (quotient_pred_set.GSPECR R1 R2 f2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      l f e.
        list.FOLDR f e l =
        abs2
          (list.FOLDR (quotient.--> abs1 (quotient.--> abs2 rep2) f)
             (rep2 e) (map rep1 l))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      l f e.
        list.FOLDL f e l =
        abs1
          (list.FOLDL (quotient.--> abs1 (quotient.--> abs2 rep1) f)
             (rep1 e) (map rep2 l))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a1 a2 b1 b2.
        R1 a1 b1 R2 a2 b2 quotient_pair.### R1 R2 (a1, a2) (b1, b2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f g x y.
        quotient.===> R1 R2 f g R1 x y
        R2 (bool.literal_case f x) (bool.literal_case g y)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f g x y.
        quotient.===> R1 R2 f g R1 x y R2 (bool.LET f x) (bool.LET g y)

P E Q.
    (x. P x quotient.respects E x Q x)
    (x y.
       quotient.respects E x Q x quotient.respects E y Q y E x y)
    (∃!) P quotient.RES_EXISTS_EQUIV E Q

(quotient_sum.+++ R1 R2 (Data.Sum.left a1) (Data.Sum.left a2)
   R1 a1 a2)
  (quotient_sum.+++ R1 R2 (Data.Sum.right b1) (Data.Sum.right b2)
   R2 b1 b2)
  (quotient_sum.+++ R1 R2 (Data.Sum.left a1) (Data.Sum.right b2) )
  (quotient_sum.+++ R1 R2 (Data.Sum.right b1) (Data.Sum.left a2) )

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      l1 l2 f1 f2.
        quotient.===> R1 R2 f1 f2 list.LIST_REL R1 l1 l2
        list.LIST_REL R2 (map f1 l1) (map f2 l2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      a1 a2 f1 f2.
        quotient.===> R1 R2 f1 f2 option.OPTREL R1 a1 a2
        option.OPTREL R2 (map f1 a1) (map f2 a2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f1 f2 x1 x2.
        quotient.===> R1 (quotient.===> R1 R2) f1 f2 R1 x1 x2
        R2 (Combinator.w f1 x1) (Combinator.w f2 x2)

R abs rep.
    quotient.QUOTIENT R abs rep
    (a. abs (rep a) = a) (a. R (rep a) (rep a))
    r s. R r s R r r R s s abs r = abs s

R.
    (x y. R x y R x = R y)
    (x. R x x) (x y. R x y R y x) x y z. R x y R y z R x z

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f g.
          f g =
          quotient.--> rep1 abs3
            (quotient.--> abs2 rep3 f quotient.--> abs1 rep2 g)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f p.
          pair.UNCURRY f p =
          abs3
            (pair.UNCURRY (quotient.--> abs1 (quotient.--> abs2 rep3) f)
               (pair.## rep1 rep2 p))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f1 f2.
          quotient.===> R1 (quotient.===> R2 R3) f1 f2
          quotient.===> (quotient_pair.### R1 R2) R3 (pair.UNCURRY f1)
            (pair.UNCURRY f2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f1 f2.
          quotient.===> (quotient_pair.### R1 R2) R3 f1 f2
          quotient.===> R1 (quotient.===> R2 R3) (pair.CURRY f1)
            (pair.CURRY f2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f g.
        quotient.===> R1 R2 f g
        quotient.respects (quotient.===> R1 R2) f
        quotient.respects (quotient.===> R1 R2) g
        quotient.--> rep1 abs2 f = quotient.--> rep1 abs2 g

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f1 f2 s1 s2.
        quotient.===> R1 R2 f1 f2 quotient.===> R1 () s1 s2
        quotient.===> R2 () (quotient_pred_set.IMAGER R1 R2 f1 s1)
          (quotient_pred_set.IMAGER R1 R2 f2 s2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f x y.
          flip f x y =
          abs3
            (flip (quotient.--> abs1 (quotient.--> abs2 rep3) f) (rep2 x)
               (rep1 y))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f a b.
          pair.CURRY f a b =
          abs3
            (pair.CURRY (quotient.--> (pair.## abs1 abs2) rep3 f) (rep1 a)
               (rep2 b))

R.
    bool.RES_FORALL
      (quotient.respects (quotient.===> (quotient.===> R ()) ()))
      (λP.
         P pred_set.EMPTY
         bool.RES_FORALL (quotient.respects (quotient.===> R ()))
           (λs.
              quotient_pred_set.FINITER R s P s
              bool.RES_FORALL (quotient.respects R)
                (λe. ¬bool.IN e s P (quotient_pred_set.INSERTR R e s)))
         bool.RES_FORALL (quotient.respects (quotient.===> R ()))
           (λs. quotient_pred_set.FINITER R s P s))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      l1 l2 f1 f2 e1 e2.
        quotient.===> R1 (quotient.===> R2 R2) f1 f2 R2 e1 e2
        list.LIST_REL R1 l1 l2
        R2 (list.FOLDR f1 e1 l1) (list.FOLDR f2 e2 l2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      l1 l2 f1 f2 e1 e2.
        quotient.===> R1 (quotient.===> R2 R1) f1 f2 R1 e1 e2
        list.LIST_REL R2 l1 l2
        R1 (list.FOLDL f1 e1 l1) (list.FOLDL f2 e2 l2)

REL1 abs1 rep1 REL2 abs2 rep2 f1 f2.
    ((r r'. REL1 r r' REL1 r (rep1 (abs1 r')))
     r r'. REL2 r r' REL2 r (rep2 (abs2 r')))
    quotient.===> REL1 REL2 f1 f2
    quotient.===> REL1 REL2 f1
      (quotient.--> abs1 rep2 (quotient.--> rep1 abs2 f2))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f1 f2 g1 g2.
          quotient.===> R2 R3 f1 f2 quotient.===> R1 R2 g1 g2
          quotient.===> R1 R3 (f1 g1) (f2 g2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f g.
        quotient.respects (quotient.===> R1 R2) f
        quotient.respects (quotient.===> R1 R2) g
        (quotient.--> rep1 abs2 f = quotient.--> rep1 abs2 g
         x y. R1 x y R2 (f x) (g y))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      f g.
        quotient.respects (quotient.===> R1 R2) f
        quotient.respects (quotient.===> R1 R2) g
        quotient.--> rep1 abs2 f = quotient.--> rep1 abs2 g
        x y. R1 x y R2 (f x) (g y)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        R4 abs4 rep4.
          quotient.QUOTIENT R4 abs4 rep4
          f g.
            pair.## f g =
            quotient.--> (pair.## rep1 rep3) (pair.## abs2 abs4)
              (pair.## (quotient.--> abs1 rep2 f)
                 (quotient.--> abs3 rep4 g))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        R4 abs4 rep4.
          quotient.QUOTIENT R4 abs4 rep4
          f g.
            sum.++ f g =
            quotient.--> (sum.++ rep1 rep3) (sum.++ abs2 abs4)
              (sum.++ (quotient.--> abs1 rep2 f)
                 (quotient.--> abs3 rep4 g))

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        f1 f2 x1 x2 y1 y2.
          quotient.===> R1 (quotient.===> R2 R3) f1 f2 R2 x1 x2
          R1 y1 y2 R3 (flip f1 x1 y1) (flip f2 x2 y2)

P.
    (R1 R2 a1 a2. P R1 R2 (Data.Sum.left a1) (Data.Sum.left a2))
    (R1 R2 b1 b2. P R1 R2 (Data.Sum.right b1) (Data.Sum.right b2))
    (R1 R2 a1 b2. P R1 R2 (Data.Sum.left a1) (Data.Sum.right b2))
    (R1 R2 b1 a2. P R1 R2 (Data.Sum.right b1) (Data.Sum.left a2))
    v v1 v2 v3. P v v1 v2 v3

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        R4 abs4 rep4.
          quotient.QUOTIENT R4 abs4 rep4
          f1 f2 g1 g2.
            quotient.===> R1 R2 f1 f2 quotient.===> R3 R4 g1 g2
            quotient.===> (quotient_pair.### R1 R3)
              (quotient_pair.### R2 R4) (pair.## f1 g1) (pair.## f2 g2)

R1 abs1 rep1.
    quotient.QUOTIENT R1 abs1 rep1
    R2 abs2 rep2.
      quotient.QUOTIENT R2 abs2 rep2
      R3 abs3 rep3.
        quotient.QUOTIENT R3 abs3 rep3
        R4 abs4 rep4.
          quotient.QUOTIENT R4 abs4 rep4
          f1 f2 g1 g2.
            quotient.===> R1 R2 f1 f2 quotient.===> R3 R4 g1 g2
            quotient.===> (quotient_sum.+++ R1 R3) (quotient_sum.+++ R2 R4)
              (sum.++ f1 g1) (sum.++ f2 g2)

External Type Operators

External Constants

Assumptions

wellFounded empty

x. bool.IN x pred_set.UNIV

t. t

bool.IN = λx f. f x

bool.literal_case = λf x. f x

bool.LET = λf x. f x

¬¬p p

x. ¬bool.IN x pred_set.EMPTY

x. id x = x

t. t ¬t

(¬) = λt. t

() = λP. P ((select) P)

t. (x. t) t

t. (x. t) t

t. (λx. t x) = t

() = λP. P = λx.

¬(p q) p

x. x = x

t. ¬¬t t

¬(p q) ¬q

¬(p q) ¬p

¬(p q) ¬q

A. A ¬A

t. ¬t t

t. (t ) ¬t

x y. const x y = x

() = λp q. p q p

x. (fst x, snd x) = x

x y. ¬(Data.Sum.left x = Data.Sum.right y)

x y. fst (x, y) = x

x y. snd (x, y) = y

a1 a0. ¬([] = a0 :: a1)

a1 a0. ¬(a0 :: a1 = [])

P x. P x P ((select) P)

P x. bool.IN x P P x

pair.pair_CASE (x, y) f = f x y

x. q r. x = (q, r)

x y. x = y y = x

x y. x = y y = x

A B. A B B A

f x. Combinator.w f x = f x x

(¬A ) (A )

opt. opt = none x. opt = some x

() = λp q. (λf. f p q) = λf. f

null [] h t. ¬null (h :: t)

(x. Data.Sum.isLeft (Data.Sum.left x))
  y. ¬Data.Sum.isLeft (Data.Sum.right y)

(x. Data.Sum.isRight (Data.Sum.right x))
  y. ¬Data.Sum.isRight (Data.Sum.left y)

P. ¬(x. P x) x. ¬P x

P. ¬(x. P x) x. ¬P x

() = λP. q. (x. P x q) q

(x. isNone (some x) ) (isNone none )

(x. isSome (some x) ) (isSome none )

m n. suc m = suc n m = n

s t. pred_set.DISJOINT s t pred_set.INTER s t = pred_set.EMPTY

f g x. (f g) x = f (g x)

f x y. flip f x y = f y x

l. l = [] h t. l = h :: t

f g. f = g x. f x = g x

ss. (x. ss = Data.Sum.left x) y. ss = Data.Sum.right y

f x y. pair.UNCURRY f (x, y) = f x y

f x y. pair.CURRY f x y = f (x, y)

() = λt1 t2. t. (t1 t) (t2 t) t

t1 t2. (t1 t2) (t2 t1) (t1 t2)

(p ¬q) (p q) (¬q ¬p)

¬(¬A B) A ¬B

P f. bool.RES_EXISTS P f x. bool.IN x P f x

P f. bool.RES_FORALL P f x. bool.IN x P f x

P Q. (y. P Q y) P x. Q x

P Q. (y. P Q y) P x. Q x

P Q. P (x. Q x) y. P Q y

P Q. (x. P x Q) (x. P x) Q

P Q. (x. P x) Q a2. P a2 Q

s t. pred_set.PSUBSET s t pred_set.SUBSET s t ¬(s = t)

¬(A B) (A ) ¬B

(x, y) = (a, b) x = a y = b

x y z. x = y y = z x = z

t1 t2 t3. t1 t2 t3 (t1 t2) t3

t1 t2 t3. t1 t2 t3 t1 t2 t3

A B C. A B C (A B) C

p m x. bool.IN x p bool.RES_ABSTRACT p m x = m x

s t. s = t x. bool.IN x s bool.IN x t

s t. pred_set.SUBSET s t x. bool.IN x s bool.IN x t

f v. bool.IN v (pred_set.GSPEC f) x. (v, ) = f x

t1 t2. (if then t1 else t2) = t1 (if then t1 else t2) = t2

length [] = 0 h t. length (h :: t) = suc (length t)

f g p. pair.## f g p = (f (fst p), g (snd p))

(t. ¬¬t t) (¬ ) (¬ )

concat [] = [] h t. concat (h :: t) = h @ concat t

x y s. bool.IN x (pred_set.INSERT y s) x = y bool.IN x s

f l1 l2. map f (l1 @ l2) = map f l1 @ map f l2

s t x. bool.IN x (pred_set.INTER s t) bool.IN x s bool.IN x t

s t x. bool.IN x (pred_set.UNION s t) bool.IN x s bool.IN x t

(∃!) = λP. () P x y. P x P y x = y

f b x y. f (if b then x else y) = if b then f x else f y

f g x y. pair.## f g (x, y) = (f x, g y)

s x y. bool.IN x (pred_set.DELETE s y) bool.IN x s ¬(x = y)

s t x. bool.IN x (pred_set.DIFF s t) bool.IN x s ¬bool.IN x t

P Q. (x. P x Q x) (x. P x) x. Q x

P Q. (x. P x Q x) (x. P x) x. Q x

(f x. map f (some x) = some (f x)) f. map f none = none

P. P [] (t. P t h. P (h :: t)) l. P l

reverse [] = [] h t. reverse (h :: t) = reverse t @ h :: []

y s f. bool.IN y (pred_set.IMAGE f s) x. y = f x bool.IN x s

a0 a1 a0' a1'. a0 :: a1 = a0' :: a1' a0 = a0' a1 = a1'

s.
    pred_set.FINITE s
    P. P pred_set.EMPTY (s. P s e. P (pred_set.INSERT e s)) P s

(p q r) (p q) (p ¬r) (¬q r ¬p)

(p q r) (p ¬q) (p ¬r) (q r ¬p)

R. wellFounded R P. (x. (y. R y x P y) P x) x. P x

(p q r) (p ¬q ¬r) (q ¬p) (r ¬p)

(l. [] @ l = l) l1 l2 h. (h :: l1) @ l2 = h :: l1 @ l2

A B. (¬(A B) ¬A ¬B) (¬(A B) ¬A ¬B)

M R f.
    f = relation.WFREC R M wellFounded R
    x. f x = M (relation.RESTRICT f R x) x

(f. map f [] = []) f h t. map f (h :: t) = f h :: map f t

(P. all P [] ) P h t. all P (h :: t) P h all P t

(P. any P [] ) P h t. any P (h :: t) P h any P t

(y x. Data.Sum.left x = Data.Sum.left y x = y)
  y x. Data.Sum.right x = Data.Sum.right y x = y

(x f f1. sum.sum_CASE (Data.Sum.left x) f f1 = f x)
  y f f1. sum.sum_CASE (Data.Sum.right y) f f1 = f1 y

t. (( t) t) ((t ) t) (( t) ¬t) ((t ) ¬t)

P f.
    bool.RES_EXISTS_UNIQUE P f
    bool.RES_EXISTS P (λx. f x)
    bool.RES_FORALL P (λx. bool.RES_FORALL P (λy. f x f y x = y))

(f g a. sum.++ f g (Data.Sum.left a) = Data.Sum.left (f a))
  f g b. sum.++ f g (Data.Sum.right b) = Data.Sum.right (g b)

(P. filter P [] = [])
  P h t. filter P (h :: t) = if P h then h :: filter P t else filter P t

(f e. list.FOLDR f e [] = e)
  f e x l. list.FOLDR f e (x :: l) = f x (list.FOLDR f e l)

(f e. list.FOLDL f e [] = e)
  f e x l. list.FOLDL f e (x :: l) = list.FOLDL f (f e x) l

t. ( t t) (t t) ( t ) (t ) (t t t)

t. ( t ) (t ) ( t t) (t t) (t t t)

t. ( t t) (t ) ( t ) (t t ) (t ¬t)

R x y.
    option.OPTREL R x y
    x = none y = none x0 y0. x = some x0 y = some y0 R x0 y0

(p q r) (p q r) (p ¬r ¬q) (q ¬r ¬p) (r ¬q ¬p)

(list.LIST_REL R [] [] ) (list.LIST_REL R (a :: as) [] )
  (list.LIST_REL R [] (b :: bs) )
  (list.LIST_REL R (a :: as) (b :: bs) R a b list.LIST_REL R as bs)

(x y. some x = some y x = y) (x. option.THE (some x) = x)
  (x. ¬(none = some x)) (x. ¬(some x = none))
  (x. isSome (some x) ) (isSome none )
  (x. isNone x x = none) (x. ¬isSome x x = none)
  (x. isSome x some (option.THE x) = x)
  (x. option.option_CASE x none some = x)
  (x. option.option_CASE x x some = x)
  (x. isNone x option.option_CASE x e f = e)
  (x. isSome x option.option_CASE x e f = f (option.THE x))
  (x. isSome x option.option_CASE x e some = x)
  (v f. option.option_CASE none v f = v)
  (x v f. option.option_CASE (some x) v f = f x)
  (f x. map f (some x) = some (f x)) (f. map f none = none)
  option.OPTION_JOIN none = none x. option.OPTION_JOIN (some x) = x