latte-prelude.equal
The formal definition of equality, and its basic properties.
decompose-equal-type
(decompose-equal-type def-env ctx t)eq-cong
(eq-cong [f (==> T U)] [eq (equal x y)])Proves (equal (f x) (f y)) by congruence of equal, cf. eq-cong-prop.
eq-cong-prop
(eq-cong-prop [f (==> T U)] [x T] [y T])(==> (equal x y) (equal (f x) (f y)))
Theorem: Congruence property of equality.
eq-intro
(eq-intro [x ?T] [y ?T])Introduction rule for equal. The type parameter T is implicit, cf. eq-intro-thm for the explicit version.
eq-intro-thm
(eq-intro-thm [T :type] [x T] [y T])(==> (forall [P (==> T :type)] (<=> (P x) (P y))) (equal x y))
Theorem: Introduction rule for equal. This is useful because equality is opaque by default.
eq-refl-thm
(eq-refl-thm [T :type] [x T])(equal x x)
Theorem: The reflexivity property of equality.
eq-subst
(eq-subst [P (==> T :type)] [eq (equal x y)] [Px (P x)])Proves (P y) given the fact that (equal x y) and (P x)
This is thanks to substitutivity of equal, cf. eq-subst-prop.
eq-subst-prop
(eq-subst-prop [P (==> T :type)] [x T] [y T])(==> (equal x y) (P x) (P y))
Theorem: Substitutivity property of equality. This is the main elimination rule.
eq-sym
(eq-sym [eq-proof (equal x y)])Proves (equal y x) from eq-proof by symmetry of equality, cf. eq-sym-thm.
eq-sym-thm
(eq-sym-thm [T :type] [x T] [y T])(==> (equal x y) (equal y x))
Theorem: The symmetry property of equality.
eq-trans
(eq-trans [eq1 (equal x y)] [eq2 (equal y z)])Proves (equal x z) from eq1 and eq2 by transitivity of equal, cf. eq-trans-thm.
eq-trans*
(eq-trans* [eq1 (equal x1 x2)] [eq2 (equal x2 x3)] ... [eqN (equal xN_1 xN)])Transitivity of equal, a n-ary version of eq-trans.
For example:
(eq-trans* eq1 eq2)
==> (eq-trans eq1 eq2)
(eq-trans* eq1 eq2 eq3)
==> (eq-trans (eq-trans eq1 eq2) eq3)
(eq-trans* eq1 eq2 eq3 eq4)
==> (eq-trans (eq-trans (eq-trans eq1 eq2) eq3) eq4)
etc. `
eq-trans-thm
(eq-trans-thm [T :type] [x T] [y T] [z T])(==> (equal x y) (equal y z) (equal x z))
Theorem: The transitivity property of equality.
equal
Equality of x and y (which must be of the same type T). This is an implicit version of equality.
equality
(equality [T :type] [x T] [y T])(forall [P (==> T :type)] (<=> (P x) (P y)))
Definition: The intuitionistic, second-order definition of equality. This corresponds to Leibniz’s indiscernibility of identicals.
nrewrite
(nrewrite n-th [Px (P x)] [eq (equal x y)])Proves (P y) from proofs of (P x) and (equal x y). The difference with eq-subst is that we try to infer the property P.
This method rewrites the n-th occurrence of (type type of) x in P (in prefix ordering), starting from 1.
The method (rewrite <Px> <eq-xy>) is the same as (and is preferable to) (nrewrite 1 <Px> <eq-xy>)
nrewrite-impl
(nrewrite-impl def-env ctx n [Px Px-type] [eq-xy eq-xy-type])Core implementation of rewriting.
rewrite
(rewrite [Px (P x)] [eq (equal x y)])Proves (P y) from proofs of (P x) and (equal x y). The difference with eq-subst is that we try to infer the property P.
This method rewrites the first occurrence of (type type of) x in P (in prefix ordering).