Package hol-quotient: HOL quotient theories
Information
name | hol-quotient |
version | 1.1 |
description | HOL quotient theories |
author | HOL OpenTheory Packager <opentheory-packager@hol-theorem-prover.org> |
license | MIT |
checksum | 4d22445a191fc3d1b6250422a88ce83e01eed04b |
requires | base hol-base hol-res-quan |
show | Data.Bool Data.List Data.Option Data.Pair Function HOL4 Number.Natural Relation |
Files
- Package tarball hol-quotient-1.1.tgz
- Theory source file hol-quotient.thy (included in the package tarball)
Defined Constants
- HOL4
- quotient
- quotient.-->
- quotient.===>
- quotient.?!!
- quotient.respects
- quotient.EQUIV
- quotient.PARTIAL_EQUIV
- quotient.QUOTIENT
- quotient.RES_EXISTS_EQUIV
- quotient_pair
- quotient_pair.###
- quotient_pred_set
- quotient_pred_set.DELETER
- quotient_pred_set.DISJOINTR
- quotient_pred_set.FINITER
- quotient_pred_set.GSPECR
- quotient_pred_set.IMAGER
- quotient_pred_set.INSERTR
- quotient_pred_set.PSUBSETR
- quotient_pred_set.SUBSETR
- quotient_sum
- quotient_sum.+++
- quotient_sum.SUM_REL_tupled
- quotient
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
- →
- bool
- Data
- List
- list
- Option
- option
- Pair
- ×
- Sum
- Data.Sum.+
- List
- Number
- Natural
- natural
- Natural
External Constants
- =
- select
- Data
- Bool
- ∀
- ∧
- ⇒
- ∃
- ∃!
- ∨
- ¬
- cond
- ⊥
- ⊤
- List
- ::
- @
- []
- all
- any
- concat
- filter
- length
- map
- null
- reverse
- Option
- isNone
- isSome
- map
- none
- some
- Pair
- ,
- fst
- snd
- Sum
- Data.Sum.isLeft
- Data.Sum.isRight
- Data.Sum.left
- Data.Sum.right
- Bool
- Function
- const
- flip
- id
- ∘
- Combinator
- Combinator.w
- HOL4
- bool
- bool.literal_case
- bool.IN
- bool.LET
- bool.RES_ABSTRACT
- bool.RES_EXISTS
- bool.RES_EXISTS_UNIQUE
- bool.RES_FORALL
- list
- list.FOLDL
- list.FOLDR
- list.LIST_REL
- option
- option.option_CASE
- option.OPTION_JOIN
- option.OPTREL
- option.THE
- pair
- pair.##
- pair.pair_CASE
- pair.CURRY
- pair.UNCURRY
- pred_set
- pred_set.DELETE
- pred_set.DIFF
- pred_set.DISJOINT
- pred_set.EMPTY
- pred_set.FINITE
- pred_set.GSPEC
- pred_set.IMAGE
- pred_set.INSERT
- pred_set.INTER
- pred_set.PSUBSET
- pred_set.SUBSET
- pred_set.UNION
- pred_set.UNIV
- relation
- relation.RESTRICT
- relation.WFREC
- sum
- sum.++
- sum.sum_CASE
- bool
- Number
- Natural
- suc
- zero
- Natural
- Relation
- empty
- wellFounded
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