Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Generalizable VariablesA B C f g.Sectioncontents.Context `{IsApart A}.
A: Type Aap: Apart A H: IsApart A x, y: A
PropHolds (x ≶ y) -> PropHolds (x <> y)
A: Type Aap: Apart A H: IsApart A x, y: A
PropHolds (x ≶ y) -> PropHolds (x <> y)
A: Type Aap: Apart A H: IsApart A x, y: A
x ≶ y -> x <> y
A: Type Aap: Apart A H: IsApart A x, y: A e: x = y
x ≶ y -> Empty
A: Type Aap: Apart A H: IsApart A x, y: A e: x = y
x = y
assumption.Qed.
A: Type Aap: Apart A H: IsApart A
forallxy : A, Stable (x = y)
A: Type Aap: Apart A H: IsApart A
forallxy : A, Stable (x = y)
A: Type Aap: Apart A H: IsApart A x, y: A
Stable (x = y)
A: Type Aap: Apart A H: IsApart A x, y: A
~~ (x = y) -> x = y
A: Type Aap: Apart A H: IsApart A x, y: A dn: ~~ (x = y)
x = y
A: Type Aap: Apart A H: IsApart A x, y: A dn: ~~ (x = y)
~ (x ≶ y)
A: Type Aap: Apart A H: IsApart A x, y: A dn: ~~ (x = y) ap: x ≶ y
Empty
A: Type Aap: Apart A H: IsApart A x, y: A dn: ~~ (x = y) ap: x ≶ y
x <> y
A: Type Aap: Apart A H: IsApart A x, y: A dn: ~~ (x = y) ap: x ≶ y
PropHolds (x ≶ y)
assumption.Qed.Endcontents.(* Due to bug #2528 *)#[export]
Hint Extern3 (PropHolds (_ <> _)) => eapply @apart_ne : typeclass_instances.
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
IsApart A
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
IsApart A
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
IsHSet A
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
is_mere_relation A apart
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
Symmetric apart
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
CoTransitive apart
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
forallxy : A, ~ (x ≶ y) <-> x = y
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
IsHSet A
exact _.
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
is_mere_relation A apart
exact _.
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
Symmetric apart
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A ap: x ≶ y
y ≶ x
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A ap: x ≶ y
x ≶ y
assumption.
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
CoTransitive apart
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A ap: x ≶ y z: A
hor (x ≶ z) (z ≶ y)
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A ap: f x ≶ f y z: A
hor (x ≶ z) (z ≶ y)
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A ap: f x ≶ f y z: A
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y
forallxy : A, ~ (x ≶ y) <-> x = y
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A
~ (x ≶ y) -> x = y
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A
x = y -> ~ (x ≶ y)
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A
~ (x ≶ y) -> x = y
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A nap: ~ (x ≶ y)
x = y
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A nap: ~ (x ≶ y)
f x = f y
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A nap: ~ (x ≶ y)
~ (f x ≶ f y)
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A nap: ~ (x ≶ y) ap: f x ≶ f y
Empty
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A nap: ~ (x ≶ y) ap: f x ≶ f y
x ≶ y
apply apart_correct;assumption.
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A
x = y -> ~ (x ≶ y)
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A e: x = y ap: x ≶ y
Empty
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A e: x = y
f x ≶ f y -> Empty
B: Type Aap: Apart B H: IsApart B A: Type H0: Apart A IsHSet0: IsHSet A is_mere_relation0: is_mere_relation A apart f: A -> B eq_correct: forallxy : A, x = y <-> f x = f y apart_correct: forallxy : A, x ≶ y <-> f x ≶ f y x, y: A e: x = y
f x = f y
apply eq_correct;assumption.Qed.
A: Type Aap: Apart A H: IsApart A P: A -> Type
is_mere_relation {x : _ & P x} apart
A: Type Aap: Apart A H: IsApart A P: A -> Type
is_mere_relation {x : _ & P x} apart
A: Type Aap: Apart A H: IsApart A P: A -> Type x, y: {x : _ & P x}
IsHProp (x ≶ y)
A: Type Aap: Apart A H: IsApart A P: A -> Type x, y: {x : _ & P x}
IsHProp (x.1 ≶ y.1)
exact _.Qed.
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x)
IsApart {x : _ & P x}
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x)
IsApart {x : _ & P x}
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x)
forall (x : {x : _ & P x}) (y : {x : _ & P x}),
x = y <-> x.1 = y.1
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x)
forall (x : {x : _ & P x}) (y : {x : _ & P x}),
x ≶ y <-> x.1 ≶ y.1
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x)
forall (x : {x : _ & P x}) (y : {x : _ & P x}),
x = y <-> x.1 = y.1
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x) x, y: {x : _ & P x}
x = y <-> x.1 = y.1
split;apply Sigma.equiv_path_sigma_hprop.
A: Type Aap: Apart A H: IsApart A P: A -> Type H0: forallx : A, IsHProp (P x)
forall (x : {x : _ & P x}) (y : {x : _ & P x}),
x ≶ y <-> x.1 ≶ y.1
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B)
IsInjective f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B)
IsInjective f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B) X: StrongExtensionality (f : A -> B)
IsInjective f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B) X: StrongExtensionality (f : A -> B) x, y: A e: f x = f y
x = y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B) X: StrongExtensionality (f : A -> B) x, y: A e: f x = f y
~ (x ≶ y)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B) X: StrongExtensionality (f : A -> B) x, y: A e: f x = f y ap: x ≶ y
Empty
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B) X: StrongExtensionality (f : A -> B) x, y: A e: ~ (f x ≶ f y) ap: x ≶ y
Empty
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B IsStrongInjective0: IsStrongInjective (f : A -> B) X: StrongExtensionality (f : A -> B) x, y: A e: ~ (f x ≶ f y) ap: x ≶ y
f x ≶ f y
apply strong_injective;auto.Qed.(* If a morphism satisfies the binary strong extensionality property, it is strongly extensional in both coordinates. *)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C)
forallz : A, StrongExtensionality (f z)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C)
forallz : A, StrongExtensionality (f z)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: A x, y: B E: f z x ≶ f z y
x ≶ y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: A x, y: B E: f z x ≶ f z y
(z ≶ z) + (x ≶ y) -> x ≶ y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: A x, y: B E: f z x ≶ f z y a: z ≶ z
x ≶ y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: A x, y: B E: f z x ≶ f z y a: z ≶ z
z ≶ z
assumption.Qed.
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C)
forallz : B,
StrongExtensionality (funx : A => f x z)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C)
forallz : B,
StrongExtensionality (funx : A => f x z)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: B x, y: A E: f x z ≶ f y z
x ≶ y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: B x, y: A E: f x z ≶ f y z
(x ≶ y) + (z ≶ z) -> x ≶ y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C StrongBinaryExtensionality0: StrongBinaryExtensionality
(f : A -> B -> C) z: B x, y: A E: f x z ≶ f y z a: z ≶ z
x ≶ y
destruct (irreflexivity (≶) z);assumption.Qed.(* Conversely, if a morphism is strongly extensional in both coordinates, it satisfies the binary strong extensionality property. We don't make this an instance in order to avoid loops. *)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z)
StrongBinaryExtensionality f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z)
StrongBinaryExtensionality f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂
hor (x₁ ≶ x₂) (y₁ ≶ y₂)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂
(f x₁ y₁ ≶ f x₂ y₁) + (f x₂ y₁ ≶ f x₂ y₂) ->
hor (x₁ ≶ x₂) (y₁ ≶ y₂)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂ a: f x₁ y₁ ≶ f x₂ y₁
((x₁ ≶ x₂) + (y₁ ≶ y₂))%type
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂ a: f x₂ y₁ ≶ f x₂ y₂
((x₁ ≶ x₂) + (y₁ ≶ y₂))%type
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂ a: f x₁ y₁ ≶ f x₂ y₁
((x₁ ≶ x₂) + (y₁ ≶ y₂))%type
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂ a: f x₁ y₁ ≶ f x₂ y₁
x₁ ≶ x₂
apply (strong_extensionality (funx => f x y₁));trivial.
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂ a: f x₂ y₁ ≶ f x₂ y₂
((x₁ ≶ x₂) + (y₁ ≶ y₂))%type
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B C: Type Aap1: Apart C H1: IsApart C IsApart0: IsApart A IsApart1: IsApart B IsApart2: IsApart C f: A -> B -> C H2: forallz : A, StrongExtensionality (f z) H3: forallz : B,
StrongExtensionality (funx : A => f x z) x₁: A y₁: B x₂: A y₂: B E: f x₁ y₁ ≶ f x₂ y₂ a: f x₂ y₁ ≶ f x₂ y₂
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B f: A -> A -> B Commutative0: Commutative f H1: forallz : A, StrongExtensionality (f z)
StrongBinaryExtensionality f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B f: A -> A -> B Commutative0: Commutative f H1: forallz : A, StrongExtensionality (f z)
StrongBinaryExtensionality f
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B f: A -> A -> B Commutative0: Commutative f H1: forallz : A, StrongExtensionality (f z)
forallz : A,
StrongExtensionality (funx : A => f x z)
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B f: A -> A -> B Commutative0: Commutative f H1: forallz : A, StrongExtensionality (f z) z, x, y: A
f x z ≶ f y z -> x ≶ y
A: Type Aap: Apart A H: IsApart A B: Type Aap0: Apart B H0: IsApart B f: A -> A -> B Commutative0: Commutative f H1: forallz : A, StrongExtensionality (f z) z, x, y: A
f z x ≶ f z y -> x ≶ y
apply (strong_extensionality (f z)).Qed.Endmore_morphisms.Sectiondefault_apart.Context `{DecidablePaths A}.Instancedefault_apart : Apart A | 20
:= funxy =>
match dec (x = y) with
| inl _ => false
| inr _ => true
end = true.Typeclasses Opaque default_apart.
A: Type H: DecidablePaths A
TrivialApart A
A: Type H: DecidablePaths A
TrivialApart A
A: Type H: DecidablePaths A
is_mere_relation A apart
A: Type H: DecidablePaths A
forallxy : A, x ≶ y <-> x <> y
A: Type H: DecidablePaths A
is_mere_relation A apart
A: Type H: DecidablePaths A
forallxy : A,
IsHProp
(match dec (x = y) with
| inl _ => false
| inr _ => true
end = true)
exact _.
A: Type H: DecidablePaths A
forallxy : A, x ≶ y <-> x <> y
A: Type H: DecidablePaths A x, y: A
match dec (x = y) with
| inl _ => false
| inr _ => true
end = true -> x <> y
A: Type H: DecidablePaths A x, y: A
x <> y ->
match dec (x = y) with
| inl _ => false
| inr _ => true
end = true
A: Type H: DecidablePaths A x, y: A
match dec (x = y) with
| inl _ => false
| inr _ => true
end = true -> x <> y
A: Type H: DecidablePaths A x, y: A E: match dec (x = y) with
| inl _ => false
| inr _ => true
end = true
x <> y
A: Type H: DecidablePaths A x, y: A p: x = y E: false = true
x <> y
A: Type H: DecidablePaths A x, y: A n: x <> y E: true = true
x <> y
A: Type H: DecidablePaths A x, y: A p: x = y E: false = true
x <> y
destruct (false_ne_true E).
A: Type H: DecidablePaths A x, y: A n: x <> y E: true = true
x <> y
trivial.
A: Type H: DecidablePaths A x, y: A
x <> y ->
match dec (x = y) with
| inl _ => false
| inr _ => true
end = true
A: Type H: DecidablePaths A x, y: A E: x <> y e: x = y
false = true
A: Type H: DecidablePaths A x, y: A E: x <> y
true = true
A: Type H: DecidablePaths A x, y: A E: x <> y e: x = y
false = true
destruct (E e).
A: Type H: DecidablePaths A x, y: A E: x <> y
true = true
split.Qed.Enddefault_apart.(* In case we have a decidable setoid, we can construct a strong setoid. Again we do not make this an instance as it will cause loops *)Sectiondec_setoid.Context `{TrivialApart A} `{DecidablePaths A}.(* Not Global in order to avoid loops *)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A
PropHolds (x <> y) -> PropHolds (x ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A
PropHolds (x <> y) -> PropHolds (x ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ap: PropHolds (x <> y)
PropHolds (x ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ap: PropHolds (x <> y)
x <> y
assumption.Qed.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
IsApart A
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
IsApart A
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
IsHSet A
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
is_mere_relation A apart
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
Symmetric apart
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
CoTransitive apart
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
forallxy : A, ~ (x ≶ y) <-> x = y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
IsHSet A
exact _.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
is_mere_relation A apart
exact _.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
Symmetric apart
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x ≶ y
y ≶ x
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x ≶ y
y <> x
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y
y <> x
intros e;apply ne,symmetry,e.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
CoTransitive apart
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
forallxy : A,
x ≶ y -> forallz : A, hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x ≶ y z: A
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A e: x = z e': z = y
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A e: x = z ne': z <> y
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A ne': x <> z
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A e: x = z e': z = y
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y, z: A e: x = z e': z = y
x = y
path_via z.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A e: x = z ne': z <> y
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A e: x = z ne': z <> y
z ≶ y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A e: x = z ne': z <> y
z <> y
assumption.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A ne': x <> z
hor (x ≶ z) (z ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A ne': x <> z
x ≶ z
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A ne: x <> y z: A ne': x <> z
x <> z
assumption.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A
forallxy : A, ~ (x ≶ y) <-> x = y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A
~ (x ≶ y) -> x = y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A
x = y -> ~ (x ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A
~ (x ≶ y) -> x = y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A nap: ~ (x ≶ y)
x = y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A nap: ~ (x ≶ y) n: x <> y
x = y
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A n: x <> y
x ≶ y
apply trivial_apart;trivial.
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A
x = y -> ~ (x ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A e: x = y
~ (x ≶ y)
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A e: x = y nap: x ≶ y
Empty
A: Type Aap: Apart A H: TrivialApart A H0: DecidablePaths A x, y: A e: x = y nap: x <> y
Empty
auto.Qed.Enddec_setoid.(* And a similar result for morphisms *)Sectiondec_setoid_morphisms.Context `{IsApart A} `{!TrivialApart A} `{IsApart B}.
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B f: A -> B
StrongExtensionality f
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B f: A -> B
StrongExtensionality f
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B f: A -> B x, y: A E: f x ≶ f y
x ≶ y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B f: A -> B x, y: A E: f x ≶ f y
x <> y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B f: A -> B x, y: A E: f x ≶ f y e: x = y
Empty
apply tight_apart in E;auto.Qed.Context `{!TrivialApart B}.
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f
IsStrongInjective f
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f
IsStrongInjective f
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f
forallxy : A, x ≶ y -> f x ≶ f y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A
x ≶ y -> f x ≶ f y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A ap: x ≶ y
f x ≶ f y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A ap: x <> y
f x ≶ f y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A ap: x <> y
f x <> f y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A ap: x <> y e: f x = f y
Empty
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A ap: x <> y e: f x = f y
x = y
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B f: A -> B IsInjective0: IsInjective f x, y: A ap: x <> y e: f x = f y
f x = f y
assumption.Qed.Context `{IsApart C}.
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C
StrongBinaryExtensionality f
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C
StrongBinaryExtensionality f
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2
hor (x1 ≶ x2) (y1 ≶ y2)
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x1 y1 ≶ f x2 y1
((x1 ≶ x2) + (y1 ≶ y2))%type
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x2 y1 ≶ f x2 y2
((x1 ≶ x2) + (y1 ≶ y2))%type
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x1 y1 ≶ f x2 y1
((x1 ≶ x2) + (y1 ≶ y2))%type
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x1 y1 ≶ f x2 y1
x1 ≶ x2
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x1 y1 ≶ f x2 y1
x1 <> x2
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x1 y1 ≶ f x2 y1 e: x1 = x2
Empty
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x1 y1 ≶ f x2 y1 e: x1 = x2 X: forallxy : C, x = y -> ~ (x ≶ y)
f x1 y1 = f x2 y1
exact (ap (funx => f x y1) e).
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x2 y1 ≶ f x2 y2
((x1 ≶ x2) + (y1 ≶ y2))%type
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x2 y1 ≶ f x2 y2
y1 ≶ y2
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x2 y1 ≶ f x2 y2
y1 <> y2
A: Type Aap: Apart A H: IsApart A TrivialApart0: TrivialApart A B: Type Aap0: Apart B H0: IsApart B TrivialApart1: TrivialApart B C: Type Aap1: Apart C H1: IsApart C f: A -> B -> C x1: A y1: B x2: A y2: B hap: f x1 y1 ≶ f x2 y2 h: f x2 y1 ≶ f x2 y2 e: y1 = y2
Empty
apply tight_apart in h;auto.Qed.Enddec_setoid_morphisms.