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 Import Basics.Overture Basics.Tactics.Require Import Basics.Overture Basics.Tactics.Require Import Pos.Core.Local Set Universe Minimization ToSet.LocalOpen Scope positive_scope.(** ** Specification of [succ] in term of [add] *)
p: Pos
p + 1 = pos_succ p
p: Pos
p + 1 = pos_succ p
bydestruct p.Qed.
p: Pos
1 + p = pos_succ p
p: Pos
1 + p = pos_succ p
bydestruct p.Qed.(** ** Specification of [add_carry] *)
cbn; apply ap, nH.Qed.(** ** Iteration and [pos_succ] *)
A: Type f: A -> A p: Pos a: A
pos_iter f (pos_succ p) a = f (pos_iter f p a)
A: Type f: A -> A p: Pos a: A
pos_iter f (pos_succ p) a = f (pos_iter f p a)
A: Type f: A -> A p: Pos a: A
pos_peano_rec (A -> A) f (fun (_ : Pos) (g : A -> A) (x : A) => f (g x))
(pos_succ p) a =
f
(pos_peano_rec (A -> A) f (fun (_ : Pos) (g : A -> A) (x : A) => f (g x)) p
a)
byrewrite pos_peano_rec_beta_pos_succ.Qed.
A: Type f: A -> A p: Pos a: A
pos_iter f (pos_succ p) a = pos_iter f p (f a)
A: Type f: A -> A p: Pos a: A
pos_iter f (pos_succ p) a = pos_iter f p (f a)
A: Type
forall (p : Pos) (f : A -> A) (a : A),
pos_iter f (pos_succ p) a = pos_iter f p (f a)
A: Type
(funp : Pos =>
forall (f : A -> A) (a : A), pos_iter f (pos_succ p) a = pos_iter f p (f a))
1
A: Type
forallp : Pos,
(funp0 : Pos =>
forall (f : A -> A) (a : A),
pos_iter f (pos_succ p0) a = pos_iter f p0 (f a)) p ->
(funp0 : Pos =>
forall (f : A -> A) (a : A),
pos_iter f (pos_succ p0) a = pos_iter f p0 (f a))
(pos_succ p)
A: Type
forallp : Pos,
(funp0 : Pos =>
forall (f : A -> A) (a : A),
pos_iter f (pos_succ p0) a = pos_iter f p0 (f a)) p ->
(funp0 : Pos =>
forall (f : A -> A) (a : A),
pos_iter f (pos_succ p0) a = pos_iter f p0 (f a))
(pos_succ p)
A: Type p: Pos q: forall (f0 : A -> A) (a0 : A),
pos_iter f0 (pos_succ p) a0 = pos_iter f0 p (f0 a0) f: A -> A a: A
pos_iter f (pos_succ (pos_succ p)) a = pos_iter f (pos_succ p) (f a)
A: Type p: Pos q: forall (f0 : A -> A) (a0 : A),
pos_iter f0 (pos_succ p) a0 = pos_iter f0 p (f0 a0) f: A -> A a: A
pos_iter f (pos_succ (pos_succ p)) a = ?Goal0
A: Type p: Pos q: forall (f0 : A -> A) (a0 : A),
pos_iter f0 (pos_succ p) a0 = pos_iter f0 p (f0 a0) f: A -> A a: A
?Goal0 = ?Goal
A: Type p: Pos q: forall (f0 : A -> A) (a0 : A),
pos_iter f0 (pos_succ p) a0 = pos_iter f0 p (f0 a0) f: A -> A a: A
pos_iter f (pos_succ p) (f a) = ?Goal
A: Type p: Pos q: forall (f0 : A -> A) (a0 : A),
pos_iter f0 (pos_succ p) a0 = pos_iter f0 p (f0 a0) f: A -> A a: A
f
(pos_peano_rec (A -> A) f (fun (_ : Pos) (g : A -> A) (x : A) => f (g x))
(pos_succ p) a) =
f
(pos_peano_rec (A -> A) f (fun (_ : Pos) (g : A -> A) (x : A) => f (g x)) p
(f a))
A: Type p: Pos q: forall (f0 : A -> A) (a0 : A),
pos_iter f0 (pos_succ p) a0 = pos_iter f0 p (f0 a0) f: A -> A a: A
pos_peano_rec (A -> A) f (fun (_ : Pos) (g : A -> A) (x : A) => f (g x))
(pos_succ p) a =
pos_peano_rec (A -> A) f (fun (_ : Pos) (g : A -> A) (x : A) => f (g x)) p
(f a)
apply q.Qed.(** ** Right reduction properties for multiplication *)
p, q: Pos
p * q~0 = (p * q)~0
p, q: Pos
p * q~0 = (p * q)~0
induction p; simpl; f_ap; f_ap; trivial.Qed.
p, q: Pos
p * q~1 = p + (p * q)~0
p, q: Pos
p * q~1 = p + (p * q)~0
p, q: Pos IHp: p * q~1 = p + (p * q)~0
q + p * q~1 = p + (q + (p * q)~0)
p, q: Pos IHp: p * q~1 = p + (p * q)~0
q + (p + (p * q)~0) = p + (q + (p * q)~0)
p, q: Pos IHp: p * q~1 = p + (p * q)~0
q + p + (p * q)~0 = p + (q + (p * q)~0)
p, q: Pos IHp: p * q~1 = p + (p * q)~0
p + q + (p * q)~0 = p + (q + (p * q)~0)
p, q: Pos IHp: p * q~1 = p + (p * q)~0
p + (q + (p * q)~0) = p + q + (p * q)~0
apply pos_add_assoc.Qed.(** ** Commutativity of multiplication *)
p, q: Pos
p * q = q * p
p, q: Pos
p * q = q * p
p: Pos
p * 1 = p
p, q: Pos IHq: p * q = q * p
p * q~0 = (q * p)~0
p, q: Pos IHq: p * q = q * p
p * q~1 = p + (q * p)~0
p, q: Pos IHq: p * q = q * p
p * q~0 = (q * p)~0
p, q: Pos IHq: p * q = q * p
p * q~1 = p + (q * p)~0
p, q: Pos IHq: p * q = q * p
p * q~0 = (q * p)~0
p, q: Pos IHq: p * q = q * p
(p * q)~0 = (q * p)~0
f_ap.
p, q: Pos IHq: p * q = q * p
p * q~1 = p + (q * p)~0
p, q: Pos IHq: p * q = q * p
p + (p * q)~0 = p + (q * p)~0
f_ap; f_ap.Qed.(** ** Distributivity of addition over multiplication *)