Commit 09e255a9 authored by Robbert Krebbers's avatar Robbert Krebbers

Misc numbers stuff.

parent 5061c3cb
Pipeline #4040 passed with stage
in 6 minutes and 54 seconds
...@@ -59,13 +59,8 @@ Qed. ...@@ -59,13 +59,8 @@ Qed.
Instance nat_lt_pi: x y : nat, ProofIrrel (x < y). Instance nat_lt_pi: x y : nat, ProofIrrel (x < y).
Proof. apply _. Qed. Proof. apply _. Qed.
Definition sum_list_with {A} (f : A nat) : list A nat := Lemma nat_le_sum (x y : nat) : x y z, y = x + z.
fix go l := Proof. split. exists (y - x); lia. intros [z ->]; lia. Qed.
match l with
| [] => 0
| x :: l => f x + go l
end.
Notation sum_list := (sum_list_with id).
Lemma Nat_lt_succ_succ n : n < S (S n). Lemma Nat_lt_succ_succ n : n < S (S n).
Proof. auto with arith. Qed. Proof. auto with arith. Qed.
...@@ -98,10 +93,26 @@ Lemma Nat_iter_S {A} n (f: A → A) x : Nat.iter (S n) f x = f (Nat.iter n f x). ...@@ -98,10 +93,26 @@ Lemma Nat_iter_S {A} n (f: A → A) x : Nat.iter (S n) f x = f (Nat.iter n f x).
Proof. done. Qed. Proof. done. Qed.
Lemma Nat_iter_S_r {A} n (f: A A) x : Nat.iter (S n) f x = Nat.iter n f (f x). Lemma Nat_iter_S_r {A} n (f: A A) x : Nat.iter (S n) f x = Nat.iter n f (f x).
Proof. induction n; f_equal/=; auto. Qed. Proof. induction n; f_equal/=; auto. Qed.
Lemma nat_iter_ind {A} (P : A Prop) f x k : Lemma Nat_iter_ind {A} (P : A Prop) f x k :
P x ( y, P y P (f y)) P (Nat.iter k f x). P x ( y, P y P (f y)) P (Nat.iter k f x).
Proof. induction k; simpl; auto. Qed. Proof. induction k; simpl; auto. Qed.
Definition sum_list_with {A} (f : A nat) : list A nat :=
fix go l :=
match l with
| [] => 0
| x :: l => f x + go l
end.
Notation sum_list := (sum_list_with id).
Definition max_list_with {A} (f : A nat) : list A nat :=
fix go l :=
match l with
| [] => 0
| x :: l => f x `max` go l
end.
Notation max_list := (max_list_with id).
(** * Notations and properties of [positive] *) (** * Notations and properties of [positive] *)
Open Scope positive_scope. Open Scope positive_scope.
...@@ -122,10 +133,10 @@ Instance positive_eq_dec: EqDecision positive := Pos.eq_dec. ...@@ -122,10 +133,10 @@ Instance positive_eq_dec: EqDecision positive := Pos.eq_dec.
Instance positive_inhabited: Inhabited positive := populate 1. Instance positive_inhabited: Inhabited positive := populate 1.
Instance maybe_xO : Maybe xO := λ p, match p with p~0 => Some p | _ => None end. Instance maybe_xO : Maybe xO := λ p, match p with p~0 => Some p | _ => None end.
Instance maybe_x1 : Maybe xI := λ p, match p with p~1 => Some p | _ => None end. Instance maybe_xI : Maybe xI := λ p, match p with p~1 => Some p | _ => None end.
Instance: Inj (=) (=) (~0). Instance xO_inj : Inj (=) (=) (~0).
Proof. by injection 1. Qed. Proof. by injection 1. Qed.
Instance: Inj (=) (=) (~1). Instance xI_inj : Inj (=) (=) (~1).
Proof. by injection 1. Qed. Proof. by injection 1. Qed.
(** Since [positive] represents lists of bits, we define list operations (** Since [positive] represents lists of bits, we define list operations
...@@ -150,14 +161,14 @@ Fixpoint Preverse_go (p1 p2 : positive) : positive := ...@@ -150,14 +161,14 @@ Fixpoint Preverse_go (p1 p2 : positive) : positive :=
end. end.
Definition Preverse : positive positive := Preverse_go 1. Definition Preverse : positive positive := Preverse_go 1.
Global Instance: LeftId (=) 1 (++). Global Instance Papp_1_l : LeftId (=) 1 (++).
Proof. intros p. by induction p; intros; f_equal/=. Qed. Proof. intros p. by induction p; intros; f_equal/=. Qed.
Global Instance: RightId (=) 1 (++). Global Instance Papp_1_r : RightId (=) 1 (++).
Proof. done. Qed. Proof. done. Qed.
Global Instance: Assoc (=) (++). Global Instance Papp_assoc : Assoc (=) (++).
Proof. intros ?? p. by induction p; intros; f_equal/=. Qed. Proof. intros ?? p. by induction p; intros; f_equal/=. Qed.
Global Instance: p : positive, Inj (=) (=) (++ p). Global Instance Papp_inj p : Inj (=) (=) (++ p).
Proof. intros p ???. induction p; simplify_eq; auto. Qed. Proof. intros ???. induction p; simplify_eq; auto. Qed.
Lemma Preverse_go_app p1 p2 p3 : Lemma Preverse_go_app p1 p2 p3 :
Preverse_go p1 (p2 ++ p3) = Preverse_go p1 p3 ++ Preverse_go 1 p2. Preverse_go p1 (p2 ++ p3) = Preverse_go p1 p3 ++ Preverse_go 1 p2.
...@@ -181,6 +192,13 @@ Fixpoint Plength (p : positive) : nat := ...@@ -181,6 +192,13 @@ Fixpoint Plength (p : positive) : nat :=
Lemma Papp_length p1 p2 : Plength (p1 ++ p2) = (Plength p2 + Plength p1)%nat. Lemma Papp_length p1 p2 : Plength (p1 ++ p2) = (Plength p2 + Plength p1)%nat.
Proof. by induction p2; f_equal/=. Qed. Proof. by induction p2; f_equal/=. Qed.
Lemma Plt_sum (x y : positive) : x < y z, y = x + z.
Proof.
split.
- exists (y - x)%positive. symmetry. apply Pplus_minus. lia.
- intros [z ->]. lia.
Qed.
Close Scope positive_scope. Close Scope positive_scope.
(** * Notations and properties of [N] *) (** * Notations and properties of [N] *)
...@@ -196,7 +214,7 @@ Infix "`mod`" := N.modulo (at level 35) : N_scope. ...@@ -196,7 +214,7 @@ Infix "`mod`" := N.modulo (at level 35) : N_scope.
Arguments N.add _ _ : simpl never. Arguments N.add _ _ : simpl never.
Instance: Inj (=) (=) Npos. Instance Npos_inj : Inj (=) (=) Npos.
Proof. by injection 1. Qed. Proof. by injection 1. Qed.
Instance N_eq_dec: EqDecision N := N.eq_dec. Instance N_eq_dec: EqDecision N := N.eq_dec.
...@@ -573,6 +591,15 @@ Proof. ...@@ -573,6 +591,15 @@ Proof.
change 2%positive with (2 * 1)%positive. by rewrite Qp_div_S, Qp_div_1. change 2%positive with (2 * 1)%positive. by rewrite Qp_div_S, Qp_div_1.
Qed. Qed.
Lemma Qp_lt_sum (x y : Qp) : (x < y)%Qc z, y = (x + z)%Qp.
Proof.
split.
- intros Hlt%Qclt_minus_iff. exists (mk_Qp (y - x) Hlt). apply Qp_eq; simpl.
by rewrite (Qcplus_comm y), Qcplus_assoc, Qcplus_opp_r, Qcplus_0_l.
- intros [z ->]; simpl.
rewrite <-(Qcplus_0_r x) at 1. apply Qcplus_lt_mono_l, Qp_prf.
Qed.
Lemma Qp_lower_bound q1 q2 : q q1' q2', (q1 = q + q1' q2 = q + q2')%Qp. Lemma Qp_lower_bound q1 q2 : q q1' q2', (q1 = q + q1' q2 = q + q2')%Qp.
Proof. Proof.
revert q1 q2. cut ( q1 q2 : Qp, (q1 q2)%Qc revert q1 q2. cut ( q1 q2 : Qp, (q1 q2)%Qc
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment