Built with Alectryon. 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.
Require ImportRequire Import
  HoTT.Classes.orders.naturals
  HoTT.Classes.implementations.peano_naturals.
Require Import
  HoTT.Classes.interfaces.abstract_algebra
  HoTT.Classes.interfaces.orders
  HoTT.Classes.theory.naturals.


Generalizable Variables N.

Section contents.
Context `{Funext} `{Univalence}.
Context `{Naturals N}.
(* Add Ring N : (rings.stdlib_semiring_theory N). *)

(* NatDistance instances are all equivalent, because their behavior is fully
 determined by the specification. *)
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N

forall x y : N, nat_distance x y = nat_distance x y
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N

forall x y : N, nat_distance x y = nat_distance x y
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y: N

nat_distance x y = nat_distance x y
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y: N

match nat_distance_sig x y with | inl s => s.1 | inr s => s.1 end = match nat_distance_sig x y with | inl s => s.1 | inr s => s.1 end
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: x + z1 = y
z2: N
E2: x + z2 = y

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: x + z1 = y
z2: N
E2: y + z2 = x
z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: y + z1 = x
z2: N
E2: x + z2 = y
z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: y + z1 = x
z2: N
E2: y + z2 = x
z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: x + z1 = y
z2: N
E2: x + z2 = y

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: x + z1 = y
z2: N
E2: x + z2 = y

x + z1 = x + z2
path_via y.
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: x + z1 = y
z2: N
E2: y + z2 = x

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1, z2: N
E1: y + (z2 + z1) = y + 0
E2: y + z2 = x

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1, z2: N
E1: z2 + z1 = 0
E2: y + z2 = x

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1, z2: N
E1: (z2 = 0) * (z1 = 0)
E2: y + z2 = x

z1 = z2
destruct E1;path_via 0.
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: y + z1 = x
z2: N
E2: x + z2 = y

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1, z2: N
E1: x + (z2 + z1) = x + 0
E2: x + z2 = y

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1, z2: N
E1: z2 + z1 = 0
E2: x + z2 = y

z1 = z2
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1, z2: N
E1: (z2 = 0) * (z1 = 0)
E2: x + z2 = y

z1 = z2
destruct E1;path_via 0.
H: Funext
H0: Univalence
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H1: Naturals N
a, b: NatDistance N
x, y, z1: N
E1: y + z1 = x
z2: N
E2: y + z2 = x

z1 = z2
apply (left_cancellation plus y);path_via x. Qed. End contents. (* An existing instance of [CutMinus] allows to create an instance of [NatDistance] *)
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x y : N, Decidable (x ≤ y)

NatDistance N
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x y : N, Decidable (x ≤ y)

NatDistance N
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x y : N, Decidable (x ≤ y)

forall x y : N, {z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: x ≤ y

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: ~ (x ≤ y)
{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: x ≤ y

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: x ≤ y

{z : N & x + z = y}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: x ≤ y

x + (y ∸ x) = y
rewrite rings.plus_comm;apply cut_minus_le;trivial.
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: ~ (x ≤ y)

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: ~ (x ≤ y)

{z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
TrivialApart0: TrivialApart N
cm: CutMinus N
CutMinusSpec0: CutMinusSpec N cm
H0: forall x0 y0 : N, Decidable (x0 ≤ y0)
x, y: N
E: ~ (x ≤ y)

y + (x ∸ y) = x
rewrite rings.plus_comm;apply cut_minus_le, orders.le_flip;trivial. Defined. (* Using the preceding instance we can make an instance for arbitrary models of the naturals by translation into [nat] on which we already have a [CutMinus] instance. *)
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N

NatDistance N
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N

NatDistance N
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat x + n = naturals_to_semiring N nat y

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat y + n = naturals_to_semiring N nat x
{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat x + n = naturals_to_semiring N nat y

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat x + n = naturals_to_semiring N nat y

{z : N & x + z = y}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat x + n = naturals_to_semiring N nat y

x + naturals_to_semiring nat N n = y
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat x + n = naturals_to_semiring N nat y

x + naturals_to_semiring nat N n = naturals_to_semiring nat N (naturals_to_semiring N nat x + n)
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat x + n = naturals_to_semiring N nat y

x + naturals_to_semiring nat N n = x + naturals_to_semiring nat N n
split.
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat y + n = naturals_to_semiring N nat x

{z : N & x + z = y} + {z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat y + n = naturals_to_semiring N nat x

{z : N & y + z = x}
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat y + n = naturals_to_semiring N nat x

y + naturals_to_semiring nat N n = x
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat y + n = naturals_to_semiring N nat x

y + naturals_to_semiring nat N n = naturals_to_semiring nat N (naturals_to_semiring N nat y + n)
N: Type
Aap: Apart N
Aplus: Plus N
Amult: Mult N
Azero: Zero N
Aone: One N
Ale: Le N
Alt: Lt N
U: NaturalsToSemiRing N
H: Naturals N
x, y: N
n: nat
E: naturals_to_semiring N nat y + n = naturals_to_semiring N nat x

y + naturals_to_semiring nat N n = y + naturals_to_semiring nat N n
split. Defined.