Properties of operators on 0,1
|
Set Implicit Arguments.
Set Strict Implicit.
Require Import U_base.
Require Export Arith.
Module Univ_prop (Univ:Universe).
Import Univ.
Hint Resolve Ueq_refl.
Hint Resolve Upos Unit Udiff_0_1 Unth_prop Ueq_le.
Hint Resolve Uplus_sym Uplus_assoc Umult_sym Umult_assoc.
Hint Resolve Uinv_one Uinv_opp_left Uinv_plus_left.
Hint Resolve Uplus_zero_left Umult_one_left Udistr_plus_right Udistr_inv_right.
Hint Resolve Uplus_le_compat_right Umult_le_compat_right Uinv_le_compat.
Hint Resolve lub_le le_lub lub_eq_mult lub_eq_plus_cte_right.
Hint Resolve Ule_total.
Hint Immediate Ueq_sym Ule_antisym Ueq_double_neg.
Open Scope U_scope.
Lemma Ule_0_1 : U0 <= U1.
Lemma Ule_refl : forall x:U,(x <= x).
Hint Resolve Ule_refl.
Lemma Ueq_trans : forall x y z:U, x == y -> y == z -> x == z.
Hint Resolve Ueq_trans.
Lemma Uplus_eq_compat_right :
forall x y z:U, x == y -> (x + z) == (y + z).
Hint Resolve Uplus_eq_compat_right.
Lemma Uplus_eq_compat_left :
forall x y z:U, x == y -> (z + x) == (z + y).
Lemma Umult_eq_compat_right :
forall x y z:U, x == y -> (x * z) == (y * z).
Hint Resolve Umult_eq_compat_right.
Lemma Umult_eq_compat_left :
forall x y z:U, x == y -> (z * x) == (z * y).
Hint Resolve Uplus_eq_compat_left Umult_eq_compat_left.
Lemma Uinv_opp_right : forall x, x + Uinv x == U1.
Hint Resolve Uinv_opp_right.
Definition of |
Definition Ult (r1 r2:U) : Prop := ~(r2 <= r1).
Infix "<" := Ult : U_scope.
Hint Unfold Ult.
Lemma Usetoid : Setoid_Theory U Ueq.
Add Setoid U Ueq Usetoid.
Add Morphism Uplus : Uplus_eq_compat.
Add Morphism Umult : Umult_eq_compat.
Add Morphism Ule : Ule_eq_compat.
Add Morphism Uinv : Uinv_eq_compat.
Add Morphism Ult : Ult_eq_compat.
Left normal form with respect to associativity |
Ltac norm_assoc_left :=
match goal with
| |- context [(Uplus ?X1 (Uplus ?X2 ?X3))]
=> (setoid_rewrite (Uplus_assoc X1 X2 X3))
end.
Ltac norm_assoc_right :=
match goal with
| |- context [(Uplus (Uplus ?X1 ?X2) ?X3)]
=> (setoid_rewrite <- (Uplus_assoc X1 X2 X3))
end.
Properties of |
Lemma Ule_double_neg :
forall x y, ~~x <= y -> x <= y.
Lemma Ule_zero_eq :
forall x, x <= U0 -> x == U0.
Lemma Uge_one_eq :
forall x, U1 <= x -> x == U1.
Hint Immediate Ule_zero_eq Uge_one_eq.
Properties of |
Lemma Ult_neq : forall x y:U, x < y -> ~x == y.
Lemma Ult_neq_rev : forall x y:U, x < y -> ~y == x.
Lemma Ult_le : forall x y:U, x < y -> x <= y.
Lemma Ule_diff_lt : forall x y : U,
x <= y -> ~x==y -> x < y.
Hint Immediate Ult_neq Ult_neq_rev Ult_le.
Hint Resolve Ule_diff_lt.
Lemma Udistr_plus_left :
forall x y z:U, (y <= (Uinv z)) -> (x * (y + z)) == (x * y + x * z).
Lemma Udistr_inv_left :
forall x y:U, Uinv (x * y) == (x * (Uinv y)) + Uinv x.
Hint Resolve Uinv_eq_compat Udistr_plus_left Udistr_inv_left.
Lemma Uplus_perm2 : forall x y z : U, x + (y + z) == y + (x + z).
Lemma Umult_perm2 : forall x y z : U, x * (y * z) == y * (x * z).
Lemma Uplus_perm3 : forall x y z : U, (x + (y + z)) == z + (x + y).
Lemma Umult_perm3 : forall x y z : U, (x * (y * z)) == z * (x * y).
Hint Resolve Uplus_perm2 Umult_perm2 Uplus_perm3 Umult_perm3.
Lemma Uplus_le_compat_left :
forall x y z:U, (x <= y) -> (z + x <= z + y).
Hint Resolve Uplus_le_compat_left.
Lemma Uplus_le_compat :
forall x y z t:U, (x <= y) -> (z <= t) -> (x + z <= y + t).
Hint Immediate Uplus_le_compat.
Lemma Uplus_zero_right : forall x:U, (x + U0) == x.
Hint Resolve Uplus_zero_right.
Lemma Uinv_zero : (Uinv U0) == U1.
Hint Resolve Uinv_zero.
Lemma Uinv_inv : forall x : U, Uinv (Uinv x) == x.
Hint Resolve Uinv_inv.
Lemma Uinv_simpl :
forall x y : U, (Uinv x) == Uinv y -> x == y.
Hint Immediate Uinv_simpl.
Lemma Umult_le_compat_left :
forall x y z: U, x <= y -> (z * x) <= (z * y).
Hint Resolve Umult_le_compat_left.
Lemma Umult_one_right : forall x:U, (x * U1) == x.
Hint Resolve Umult_one_right.
Lemma Uplus_eq_simpl_right :
forall x y z:U, (z <= (Uinv x)) -> (z <= (Uinv y)) -> ((x + z) == (y + z)) -> (x == y).
Lemma Ule_plus_right : forall x y, (x <= x + y).
Lemma Ule_plus_left : forall x y, (y <= x + y).
Hint Resolve Ule_plus_right Ule_plus_left.
Lemma Ule_mult_right : forall x y, (x * y <= x ).
Lemma Ule_mult_left : forall x y, (x * y <= y).
Hint Resolve Ule_mult_right Ule_mult_left.
Lemma Uinv_le_perm_right :
forall x y:U, (x <= (Uinv y)) -> y <= (Uinv x).
Hint Resolve Uinv_le_perm_right.
Lemma Uinv_le_perm_left :
forall x y:U, ((Uinv x) <= y) -> (Uinv y) <= x.
Hint Resolve Uinv_le_perm_left.
Lemma Uinv_eq_perm_left :
forall x y:U, (x == (Uinv y)) -> Uinv x == y.
Hint Immediate Uinv_eq_perm_left.
Lemma Uinv_eq_perm_right :
forall x y:U, (Uinv x == y) -> x == (Uinv y).
Hint Immediate Uinv_eq_perm_right.
Lemma Uinv_plus_right :
forall x y, y <= (Uinv x) -> Uinv (x + y) + y == Uinv x.
Hint Resolve Uinv_plus_right.
Lemma Uplus_eq_simpl_left :
forall x y z:U, (x <= (Uinv y)) -> (x <= (Uinv z ))
-> ((x + y) == (x + z)) -> (y == z).
Lemma Uplus_eq_zero_left :
forall x y:U, (x <= Uinv y) -> (x + y) == y -> x == U0.
Lemma Uinv_le_trans :
forall x y z t, (x <= Uinv y) -> z<=x -> t<=y -> z<=Uinv t.
disequality |
Lemma neq_sym : forall x y, ~ (x==y) -> ~y==x.
Hint Immediate neq_sym.
Lemma Uinv_neq_compat : forall x y, ~ (x == y) -> ~ (Uinv x == Uinv y).
Lemma Uinv_neq_simpl : forall x y, ~ (Uinv x == Uinv y) -> ~ (x == y).
Hint Resolve Uinv_neq_compat.
Hint Immediate Uinv_neq_simpl.
Lemma Uinv_neq_left : forall x y, ~ (x == Uinv y) -> ~ (Uinv x == y).
Lemma Uinv_neq_right : forall x y, ~ (Uinv x == y) -> ~ (x == Uinv y).
strict order |
Lemma Ult_antirefl : forall x:U, ~ x < x.
Lemma Ult_0_1 : (U0 < U1).
Lemma Ule_lt_trans : forall x y z:U, x <= y -> y < z -> x < z.
Lemma Ult_le_trans : forall x y z:U, x < y -> y <= z -> x < z.
Lemma Ult_trans : forall x y z:U, x < y -> y < z -> x < z.
Hint Resolve Ult_0_1 Ult_antirefl.
Lemma not_Ult_le : forall x y, ~x < y -> y <= x.
Lemma Ule_not_lt : forall x y, x <= y -> ~ y < x.
Hint Immediate not_Ult_le Ule_not_lt.
Theorem Uplus_le_simpl_left :
forall x y z : U, z <= Uinv x -> z + x <= z + y -> x <= y.
Lemma Uplus_lt_compat_right :
forall x y z:U, (z <= Uinv y) -> (x < y) -> ((x + z) < (y + z)).
Lemma Uplus_lt_compat_left :
forall x y z:U, (z <= Uinv y) -> (x < y) -> (z + x < z + y).
Hint Resolve Uplus_lt_compat_right Uplus_lt_compat_left.
Lemma Uplus_lt_compat :
forall x y z t:U, (z <= Uinv x) -> (t <= Uinv y) ->
(x < y) -> (z < t) -> (x + z < y + t).
Hint Immediate Uplus_lt_compat.
Lemma Uplus_lt_simpl_left :
forall x y z:U, (z <= Uinv y) -> (z + x) < (z + y) -> x < y.
Lemma Uplus_lt_simpl_right :
forall x y z:U, (z <= Uinv y) -> (x + z) < (y + z) -> x < y.
Lemma Uplus_one_le : forall x y, x + y == U1 -> Uinv y <= x.
Hint Immediate Uplus_one_le.
Theorem Uplus_eq_zero :
forall x : U, (x <= Uinv x) -> (x + x) == x -> x == U0.
Lemma Umult_zero_left : forall x:U, (U0 * x) == U0.
Hint Resolve Umult_zero_left.
Lemma Umult_zero_right : forall x:U, (x * U0) == U0.
Hint Resolve Uplus_eq_zero Umult_zero_right.
| Compatibility of operations with respect to order. |
Lemma Umult_le_simpl_right :
forall x y z:U, ~(U0 == z) -> (x * z) <= (y * z) -> x <= y.
Hint Resolve Umult_le_simpl_right.
Lemma Umult_simpl_right :
forall x y z:U, ~(U0 == z) -> (x * z) == (y * z) -> x == y.
Lemma Umult_simpl_left :
forall x y z:U, ~(U0 == x) -> (x * y) == (x * z) -> y == z.
Lemma Umult_lt_compat_right :
forall x y z:U, ~(U0 == z) -> x < y -> (x * z) < (y * z).
Lemma Umult_lt_compat_left :
forall x y z:U, ~(U0 == z) -> x < y -> (z * x) < (z * y).
Lemma Umult_lt_simpl_right :
forall x y z:U, ~(U0 == z) -> (x * z) < (y * z) -> x < y.
Lemma Umult_lt_simpl_left :
forall x y z:U, ~(U0 == z) -> (z * x) < (z * y) -> x < y.
Hint Resolve Umult_lt_compat_left Umult_lt_compat_right.
More Properties |
Lemma Uplus_one : forall x y:U,
Uinv x <= y -> x + y == U1.
Hint Resolve Uplus_one.
Lemma Uplus_one_right : forall x:U, x + U1 == U1.
Lemma Uplus_one_left : forall x:U, U1 + x == U1.
Hint Resolve Uplus_one_right Uplus_one_left.
Lemma Uinv_mult_simpl : forall x y z t,
x <= Uinv y -> (x * z) <= Uinv (y * t).
Hint Resolve Uinv_mult_simpl.
Lemma Umult_inv_plus :
forall x y, x * Uinv y + y == x + y * Uinv x.
Hint Resolve Umult_inv_plus.
Lemma Umult_inv_plus_le :
forall x y z, y <= z -> x * Uinv y + y <= x * Uinv z + z.
Hint Resolve Umult_inv_plus_le.
Definition of |
Fixpoint Uexp (x:U) (n:nat) {struct n} : U :=
match n with O => U1 | (S p) => x * Uexp x p end.
Definition ofA conjonction operation which coincides with min and mult on 0 and 1, see Morgan & McIver |
Definition Uesp (x y:U) := Uinv (Uinv x + Uinv y).
Infix "&" := Uesp (left associativity, at level 40) : U_scope.
Lemma Uinv_plus_esp :
forall x y, Uinv (x + y) == Uinv x & Uinv y.
Hint Resolve Uinv_plus_esp.
Lemma Uinv_esp_plus :
forall x y, Uinv (x & y) == Uinv x + Uinv y.
Hint Resolve Uinv_esp_plus.
Lemma Uesp_sym : forall x y : U, x & y == y & x.
Lemma Uesp_one_right : forall x : U, x & U1 == x.
Lemma Uesp_zero :
forall x y, x <= Uinv y -> x & y == U0.
Hint Resolve Uesp_sym Uesp_one_right Uesp_zero.
Lemma Uesp_zero_right : forall x : U, x & U0 == U0.
Lemma Uesp_zero_left : forall x : U, U0 & x == U0.
Hint Resolve Uesp_zero_right Uesp_zero_left.
Definition of |
Definition Uminus (x y:U) := Uinv (Uinv x + y).
Infix "-" := Uminus : U_scope.
Lemma Uminus_le_compat_left :
forall x y z, x <= y -> x - z <= y - z.
Lemma Uminus_le_compat_right :
forall x y z, y <= z -> x - z <= x - y.
Hint Resolve Uminus_le_compat_left Uminus_le_compat_right.
Add Morphism Uminus : Uminus_eq_compat.
Hint Immediate Uminus_eq_compat.
Lemma Uminus_zero_right : forall x, x - U0 == x.
Lemma Uminus_one_left : forall x, U1 - x == Uinv x.
Lemma Uminus_le_zero : forall x y, x <= y -> x - y == U0.
Hint Resolve Uminus_zero_right Uminus_one_left Uminus_le_zero.
Lemma Uminus_plus_simpl :
forall x y, y <= x -> (x - y) + y == x.
Lemma Uminus_plus_zero :
forall x y, x <= y -> (x - y) + y == y.
Hint Resolve Uminus_plus_simpl Uminus_plus_zero.
Lemma Uesp_minus_distr_left :
forall x y z, (x & y) - z == (x - z) & y.
Lemma Uesp_minus_distr_right :
forall x y z, (x & y) - z == x & (y - z).
Hint Resolve Uesp_minus_distr_left Uesp_minus_distr_right.
Lemma Uesp_minus_distr :
forall x y z t, (x & y) - (z + t) == (x - z) & (y - t).
Hint Resolve Uesp_minus_distr.
Definition of max |
Definition max (x y : U) : U := (x - y) + y.
Lemma max_le_right : forall x y : U, y <= x -> (max x y) == x.
Lemma max_le_left : forall x y : U, x <= y -> (max x y) == y.
Hint Resolve max_le_right max_le_left.
Lemma max_le_case : forall x y : U, (max x y) == x \/ (max x y) == y.
Add Morphism max : max_eq_compat.
Lemma Uplus_minus_simpl_right :
forall x y, y <= Uinv x -> (x + y) - y == x.
Hint Resolve Uplus_minus_simpl_right.
Lemma Uplus_minus_simpl_left :
forall x y, y <= Uinv x -> (x + y) - x == y.
Lemma Uminus_assoc_left :
forall x y z, (x - y) - z == x - (y + z).
Hint Resolve Uminus_assoc_left.
Lemma Uminus_le_perm_left :
forall x y z, y <= x -> x - y <= z -> x <= z + y.
Lemma Uplus_le_perm_left :
forall x y z, y <= x -> x <= y + z -> x - y <= z.
Lemma Uminus_eq_perm_left :
forall x y z, y <= x -> x - y == z -> x == z + y.
Lemma Uplus_eq_perm_left :
forall x y z, y <= Uinv z -> x == y + z -> x - y == z.
Hint Resolve Uminus_le_perm_left Uminus_eq_perm_left.
Hint Resolve Uplus_le_perm_left Uplus_eq_perm_left.
Lemma Uminus_le_perm_right :
forall x y z, z <= y -> x <= y - z -> x + z <= y.
Lemma Uplus_le_perm_right :
forall x y z, z <= Uinv x -> x + z <= y -> x <= y - z.
Hint Resolve Uminus_le_perm_right Uplus_le_perm_right.
Lemma Uminus_le_perm :
forall x y z, z <= y -> x <= Uinv z -> x <= y - z -> z <= y - x.
Hint Resolve Uminus_le_perm.
Lemma Uminus_eq_perm_right :
forall x y z, z <= y -> x == y - z -> x + z == y.
Hint Resolve Uminus_eq_perm_right.
Lemma Uminus_zero_le :
forall x y, x - y == U0 -> x <= y.
Lemma Uminus_lt_non_zero :
forall x y, x < y -> ~y - x == U0.
Hint Immediate Uminus_zero_le Uminus_lt_non_zero.
Lemma Ult_le_nth :
forall x y, x < y -> (exists n, x <= y - Unth n).
Lemma Uminus_distr_left :
forall x y z, (x - y) * z == (x * z) - (y * z).
Hint Resolve Uminus_distr_left.
Lemma Uminus_distr_right :
forall x y z, x * (y - z) == (x * y) - (x * z).
Hint Resolve Uminus_distr_right.
Lemma Uminus_assoc_right :
forall x y z, y <= x -> z <= y -> x - (y - z) == (x - y) + z.
Properties of generalized sums |
Definition sigma (alpha : nat -> U) (n:nat) := comp Uplus U0 alpha n.
Lemma sigma0 : forall (alpha : nat -> U) (n:nat), sigma alpha 0 = U0.
Lemma sigmaS : forall (alpha : nat -> U) (n:nat),
sigma alpha (S n) = (alpha n) + (sigma alpha n).
Lemma sigma_incr : forall (f : nat -> U) (n m:nat),
(n <= m)%nat -> (sigma f n) <= (sigma f m).
Hint Resolve sigma_incr.
Lemma sigma_eq_compat : forall (f g: nat -> U) (n:nat),
(forall k, (k <= n)%nat -> f k == g k) -> (sigma f n) == (sigma g n).
Lemma sigma_le_compat : forall (f g: nat -> U) (n:nat),
(forall k, (k <= n)%nat -> f k <= g k) -> (sigma f n) <= (sigma g n).
Hint Resolve sigma_eq_compat sigma_le_compat.
Properties of
|
Lemma Unth_zero : Unth 0 == U1.
Lemma Unth_one : Unth 1 == Uinv (Unth 1).
Hint Resolve Unth_zero Unth_one.
Lemma Unth_one_plus : Unth 1 + Unth 1 == U1.
Hint Resolve Unth_one_plus.
Lemma Unth_not_null : forall n, ~(U0 == Unth n).
Hint Resolve Unth_not_null.
Lemma Unth_prop_sigma : forall n,
Unth n == Uinv (sigma (fun k => Unth n) n).
Hint Resolve Unth_prop_sigma.
Lemma Unth_sigma_n :
forall n : nat, ~(U1 == sigma (fun k => Unth n) n).
Lemma Unth_sigma_Sn :
forall n : nat, U1 == sigma (fun k => Unth n) (S n).
Hint Resolve Unth_sigma_n Unth_sigma_Sn.
Lemma Unth_decr : forall n, Unth (S n) < Unth n.
Hint Resolve Unth_decr.
Lemma Unth_le_half : forall n, Unth (S n) <= Unth 1.
Hint Resolve Unth_le_half.
mean of two numbers |
Definition mean (x y:U) := Unth 1 * x + Unth 1 * y.
Lemma mean_eq : forall x:U, mean x x ==x.
Lemma mean_le_compat_right :
forall x y z, y <= z -> mean x y <= mean x z.
Lemma mean_le_compat_left :
forall x y z, x <= y -> mean x z <= mean y z.
Hint Resolve mean_eq mean_le_compat_left mean_le_compat_right.
Lemma mean_lt_compat_right :
forall x y z, y < z -> mean x y < mean x z.
Lemma mean_lt_compat_left :
forall x y z, x < y -> mean x z < mean y z.
Hint Resolve mean_eq mean_le_compat_left mean_le_compat_right.
Hint Resolve mean_lt_compat_left mean_lt_compat_right.
Lemma mean_le_up : forall x y, x <= y -> mean x y <= y.
Lemma mean_le_down : forall x y, x <= y -> x <= mean x y.
Lemma mean_lt_up : forall x y, x < y -> mean x y < y.
Lemma mean_lt_down : forall x y, x < y -> x < mean x y.
Hint Resolve mean_le_up mean_le_down mean_lt_up mean_lt_down.
Lemma le_half_inv :
forall x, x <= Unth 1 -> x <= Uinv x.
Hint Immediate le_half_inv.
Lemma ge_half_inv :
forall x, Unth 1 <= x -> Uinv x <= x.
Hint Immediate ge_half_inv.
Lemma Uinv_le_half_left : forall x, x <= Unth 1 -> Unth 1 <= Uinv x.
Lemma Uinv_le_half_right : forall x, Unth 1 <= x -> Uinv x <= Unth 1.
Hint Resolve Uinv_le_half_left Uinv_le_half_right.
Lemma half_twice : forall x,
(x <= Unth 1) -> (Unth 1) * (x + x) == x.
Lemma half_twice_le : forall x, (Unth 1) * (x + x) <= x.
Lemma Uinv_half : forall x,
(Unth 1) * (Uinv x) + (Unth 1) == Uinv ((Unth 1) * x).
Lemma half_esp :
forall x,
(Unth 1 <= x) -> (Unth 1) * (x & x) + Unth 1 == x.
Lemma half_esp_le :
forall x, x <= (Unth 1) * (x & x) + Unth 1.
Hint Resolve half_esp_le.
Density |
Lemma Ule_lt_lim :
forall x y, (forall t, t < x -> t <= y) -> x <= y.
Properties of |
Lemma half_le :
forall x y, y <= Uinv y -> x <= y + y -> (Unth 1) * x <= y.
Lemma half_Unth : forall n, (Unth 1)*(Unth n) <= Unth (S n).
Hint Resolve half_le half_Unth.
Lemma half_exp :
forall n, Uexp (Unth 1) n == Uexp (Unth 1) (S n) + Uexp (Unth 1) (S n).
Properties of least upper bounds |
Section lubs.
Lemma lub_le_stable :
forall f g : nat -> U, (forall n, f n <= g n)
-> lub f <= lub g.
Hint Resolve lub_le_stable.
Lemma lub_eq_stable :
forall f g, (forall n, f n == g n) -> lub f == lub g.
Hint Resolve lub_eq_stable.
Lemma lub_zero : (lub (fun n => U0)) == U0.
Lemma lub_un : (lub (fun n => U1)) == U1.
Lemma lub_cte : forall c:U, (lub (fun n => c)) == c.
Hint Resolve lub_zero lub_un lub_cte.
Lemma lub_eq_plus_cte_left :
forall (f : nat -> U) (k:U), lub (fun n => k + (f n)) == k + (lub f).
Hint Resolve lub_eq_plus_cte_left.
Variables f g : nat -> U.
Hypothesis monf : (mon_seq Ule f).
Hypothesis mong : (mon_seq Ule g).
Lemma lub_lift : forall n,
(lub f) == (lub (fun k => f (n+k)%nat)).
Hint Resolve lub_lift.
Let sum := fun n => f n + g n.
Lemma mon_sum : mon_seq Ule sum.
Hint Resolve mon_sum.
Lemma lub_eq_plus : lub (fun n => (f n) + (g n)) == (lub f) + (lub g).
Hint Resolve lub_eq_plus.
Variables k : U.
Let prod := fun n => k * f n.
Lemma mon_prod : mon_seq Ule prod.
Let inv:= fun n => Uinv (g n).
Lemma lub_inv :
(forall n, f n <= inv n) -> lub f <= Uinv (lub g).
End lubs.
Properties of barycentre of two points |
Section Barycentre.
Variables a b : U.
Hypothesis sum_le_one : a <= Uinv b.
Lemma Uinv_bary :
forall x y : U,
Uinv (a * x + b * y) == a * Uinv x + b * Uinv y + Uinv (a + b).
End Barycentre.
Lemma sigma_plus :
forall (f g : nat -> U) (n:nat),
(sigma (fun k => (f k) + (g k)) n) == (sigma f n) + (sigma g n).
Definition retract (f : nat -> U) :=
forall n, (f n) <= Uinv (sigma f n).
Lemma sigma_mult :
forall (f : nat -> U) (n:nat) (c:U),
retract f -> (sigma (fun k => c * (f k)) n) == c * (sigma f n).
Hint Resolve sigma_mult.
Lemma sigma_prod_maj :
forall (f g : nat -> U),
forall n, (sigma (fun k => (f k) * (g k)) n) <= (sigma f n).
Hint Resolve sigma_prod_maj.
Lemma sigma_prod_le :
forall (f g : nat -> U) (c:U),
(forall k, (f k) <= c) -> (retract g) ->
forall n, (sigma (fun k => (f k) * (g k)) n) <= c * (sigma g n).
Lemma sigma_prod_ge :
forall (f g : nat -> U) (c:U),
(forall k, c <= (f k)) -> (retract g) ->
forall n, c * (sigma g n) <= (sigma (fun k => (f k) * (g k)) n).
Hint Resolve sigma_prod_maj sigma_prod_le sigma_prod_ge.
Lemma sigma_inv :
forall (f g : nat -> U) (n:nat), (retract f) ->
Uinv (sigma (fun k => (f k) * (g k)) n) ==
(sigma (fun k => (f k) * Uinv (g k)) n) + Uinv (sigma f n).
Product by an integer |
Definition Nmult (n: nat) (x : U) : U := sigma (fun k => x) n.
| Condition for n */ x to be exact |
Definition Nmult_def (n: nat) (x : U) :=
match n with O => True | S p => x <= Unth p end.
Lemma Nmult_def_O : forall x, Nmult_def O x.
Hint Resolve Nmult_def_O.
Lemma Nmult_def_pred :
forall n x, Nmult_def (S n) x -> Nmult_def n x.
Hint Immediate Nmult_def_pred.
Hint Unfold Nmult_def.
Infix "*/" := Nmult (at level 60) : U_scope.
Lemma Nmult_0 : forall (x:U), (0*/x) = U0.
Lemma Nmult_S : forall (n:nat) (x:U), (S n*/x) = x + (n*/x).
Add Morphism Nmult : Nmult_eq_compat.
Lemma Nmult_le_compat_left :
forall (n:nat) (x y:U), (x <= y) -> (n */ x) <= (n */ y).
Lemma Nmult_le_compat_right :
forall (n m:nat) (x:U), (n <= m)%nat -> (n */ x) <= (m */ x).
Lemma Nmult_Unth_prop :
forall n:nat, Unth n == Uinv (n*/ (Unth n)).
Hint Resolve Nmult_Unth_prop.
Lemma Nmult_Unth :
forall n:nat, (n*/ Unth n) == Uinv (Unth n).
Hint Immediate Nmult_eq_compat.
Hint Resolve Nmult_le_compat_left Nmult_le_compat_right Nmult_Unth.
Lemma Nmult_Umult_assoc
: forall (n:nat) (x y:U), (Nmult_def n x) -> (n*/(x*y))== (n*/x)*y.
Tactic for simplification of goals |
Ltac Usimpl :=
match goal with
|- context [(Uplus U0 ?x)] =>
setoid_rewrite (Uplus_zero_left x)
| |- context [(Uplus ?x U0)] =>
setoid_rewrite (Uplus_zero_right x)
| |- context [(Uplus U1 ?x)] =>
setoid_rewrite (Uplus_one_left x)
| |- context [(Uplus ?x U1)] =>
setoid_rewrite (Uplus_one_right x)
| |- context [(Umult U0 ?x)] =>
setoid_rewrite (Umult_zero_left x)
| |- context [(Umult ?x U0)] =>
setoid_rewrite (Umult_zero_right x)
| |- context [(Umult U1 ?x)] =>
setoid_rewrite (Umult_one_left x)
| |- context [(Umult ?x U1)] =>
setoid_rewrite (Umult_one_right x)
| |- context [(Uminus U0 ?x)] =>
setoid_rewrite (Uminus_le_zero U0 x);
[apply (Upos x)| idtac]
| |- context [(Uminus ?x U0)] =>
setoid_rewrite (Uminus_zero_right x)
| |- context [(Uminus ?x U1)] =>
setoid_rewrite (Uminus_le_zero x U1);
[apply (Unit x)| idtac]
| |- context [(Uinv (Uinv ?x))] =>
setoid_rewrite (Uinv_inv x)
| |- (Ule (Uplus ?x ?y) (Uplus ?x ?z)) =>
apply Uplus_le_compat_left
| |- (Ule (Uplus ?x ?z) (Uplus ?y ?z)) =>
apply Uplus_le_compat_right
| |- (Ule (Uplus ?x ?z) (Uplus ?z ?y)) =>
setoid_rewrite (Uplus_sym z y); apply Uplus_le_compat_right
| |- (Ule (Uplus ?x ?y) (Uplus ?z ?x)) =>
setoid_rewrite (Uplus_sym x y); apply Uplus_le_compat_right
| |- (Ueq (Uplus ?x ?y) (Uplus ?x ?z)) =>
apply Uplus_eq_compat_left
| |- (Ueq (Uplus ?x ?z) (Uplus ?y ?z)) =>
apply Uplus_eq_compat_right
| |- (Ueq (Uplus ?x ?z) (Uplus ?z ?y)) =>
setoid_rewrite (Uplus_sym z y); apply Uplus_eq_compat_right
| |- (Ueq (Uplus ?x ?y) (Uplus ?z ?x)) =>
setoid_rewrite (Uplus_sym x y); apply Uplus_eq_compat_right
| |- (Ule (Umult ?x ?y) (Umult ?x ?z)) =>
apply Umult_le_compat_left
| |- (Ule (Umult ?x ?z) (Umult ?y ?z)) =>
apply Umult_le_compat_right
| |- (Ule (Umult ?x ?z) (Umult ?z ?y)) =>
setoid_rewrite (Umult_sym z y); apply Umult_le_compat_right
| |- (Ule (Umult ?x ?y) (Umult ?z ?x)) =>
setoid_rewrite (Umult_sym x y); apply Umult_le_compat_right
| |- (Ueq (Umult ?x ?y) (Umult ?x ?z)) =>
apply Umult_eq_compat_left
| |- (Ueq (Umult ?x ?z) (Umult ?y ?z)) =>
apply Umult_eq_compat_right
| |- (Ueq (Umult ?x ?z) (Umult ?z ?y)) =>
setoid_rewrite (Umult_sym z y); apply Umult_eq_compat_right
| |- (Ueq (Umult ?x ?y) (Umult ?z ?x)) =>
setoid_rewrite (Umult_sym x y); apply Umult_eq_compat_right
end.
End Univ_prop.