feat(library/algebra/monotone): add properties of monotone functions

This commit is contained in:
Jeremy Avigad 2016-02-28 21:55:48 -05:00
parent 3d09144d73
commit ebb3e60096
9 changed files with 691 additions and 120 deletions

View file

@ -24,5 +24,6 @@ Algebraic structures.
* [ring_bigops](ring_bigops.lean) : products and sums in various structures
* [order_bigops](order_bigops.lean) : min and max over finsets and finite sets
* [bundled](bundled.lean) : bundled versions of the algebraic structures
* [monotone](monotone.lean) : monotone maps between order structures
* [homomorphism](homomorphism.lean) : homomorphisms between algebraic structures
* [category](category/category.md) : category theory (outdated, see HoTT category theory folder)

View file

@ -7,7 +7,7 @@ Complete lattices
TODO: define dual complete lattice and simplify proof of dual theorems.
-/
import algebra.lattice data.set.basic
import algebra.lattice data.set.basic algebra.monotone
open set
variable {A : Type}
@ -109,7 +109,8 @@ Sup_le (take x, suppose x ∈ '{a, b},
end complete_lattice_Inf
-- Every complete_lattice_Inf is a complete_lattice_Sup
definition complete_lattice_Inf_to_complete_lattice_Sup [C : complete_lattice_Inf A] : complete_lattice_Sup A :=
definition complete_lattice_Inf_to_complete_lattice_Sup [C : complete_lattice_Inf A] :
complete_lattice_Sup A :=
⦃ complete_lattice_Sup, C ⦄
-- Every complete_lattice_Inf is a complete_lattice
@ -172,9 +173,9 @@ Sup_le (take x, suppose x ∈ '{a, b},
end complete_lattice_Sup
-- Every complete_lattice_Sup is a complete_lattice_Inf
definition complete_lattice_Sup_to_complete_lattice_Inf [C : complete_lattice_Sup A] : complete_lattice_Inf A :=
definition complete_lattice_Sup_to_complete_lattice_Inf [C : complete_lattice_Sup A] :
complete_lattice_Inf A :=
⦃ complete_lattice_Inf, C ⦄
-- Every complete_lattice_Sup is a complete_lattice
@ -189,7 +190,7 @@ variable [C : complete_lattice A]
include C
variable {f : A → A}
premise (mono : ∀ x y : A, x ≤ y → f x ≤ f y)
premise (mono : nondecreasing f)
theorem knaster_tarski : ∃ a, f a = a ∧ ∀ b, f b = b → a ≤ b :=
let a := ⨅ {u | f u ≤ u} in
@ -198,7 +199,7 @@ have h₁ : f a = a, from
have ∀ b, b ∈ {u | f u ≤ u} → f a ≤ b, from
take b, suppose f b ≤ b,
have a ≤ b, from Inf_le this,
have f a ≤ f b, from !mono this,
have f a ≤ f b, from mono this,
le.trans `f a ≤ f b` `f b ≤ b`,
le_Inf this,
have le : a ≤ f a, from
@ -221,7 +222,7 @@ have h₁ : f a = a, from
have ∀ b, b ∈ {u | u ≤ f u} → b ≤ f a, from
take b, suppose b ≤ f b,
have b ≤ a, from le_Sup this,
have f b ≤ f a, from !mono this,
have f b ≤ f a, from mono this,
le.trans `b ≤ f b` `f b ≤ f a`,
Sup_le this,
have ge : f a ≤ a, from

View file

@ -165,6 +165,11 @@ section group
theorem inv_inv [simp] (a : A) : (a⁻¹)⁻¹ = a :=
inv_eq_of_mul_eq_one (mul.left_inv a)
variable (A)
theorem left_inverse_inv : function.left_inverse (λ a : A, a⁻¹) (λ a, a⁻¹) :=
take a, inv_inv a
variable {A}
theorem inv.inj {a b : A} (H : a⁻¹ = b⁻¹) : a = b :=
have a = a⁻¹⁻¹, by simp_nohyps,
by inst_simp
@ -331,6 +336,11 @@ section add_group
theorem neg_neg [simp] (a : A) : -(-a) = a := neg_eq_of_add_eq_zero (add.left_inv a)
variable (A)
theorem left_inverse_neg : function.left_inverse (λ a : A, - a) (λ a, - a) :=
take a, neg_neg a
variable {A}
theorem eq_neg_of_add_eq_zero {a b : A} (H : a + b = 0) : a = -b :=
have -a = b, from neg_eq_of_add_eq_zero H,
by inst_simp
@ -414,7 +424,8 @@ section add_group
⦃ add_left_cancel_semigroup, s,
add_left_cancel := @add_left_cancel A s ⦄
definition add_group.to_add_right_cancel_semigroup [trans_instance] : add_right_cancel_semigroup A :=
definition add_group.to_add_right_cancel_semigroup [trans_instance] :
add_right_cancel_semigroup A :=
⦃ add_right_cancel_semigroup, s,
add_right_cancel := @add_right_cancel A s ⦄
@ -513,6 +524,19 @@ section add_group
theorem add_eq_of_eq_sub {a b c : A} (H : a = c - b) : a + b = c :=
by simp
theorem left_inverse_sub_add_left (c : A) : function.left_inverse (λ x, x - c) (λ x, x + c) :=
take x, add_sub_cancel x c
theorem left_inverse_add_left_sub (c : A) : function.left_inverse (λ x, x + c) (λ x, x - c) :=
take x, sub_add_cancel x c
theorem left_inverse_add_right_neg_add (c : A) :
function.left_inverse (λ x, c + x) (λ x, - c + x) :=
take x, add_neg_cancel_left c x
theorem left_inverse_neg_add_add_right (c : A) :
function.left_inverse (λ x, - c + x) (λ x, c + x) :=
take x, neg_add_cancel_left c x
end add_group
structure add_comm_group [class] (A : Type) extends add_group A, add_comm_monoid A

View file

@ -73,7 +73,7 @@ section add_group_A_B
injective f :=
take x₁ x₂,
suppose f x₁ = f x₂,
have f (x₁ - x₂) = 0, using this, by rewrite [hom_sub, this, sub_self],
have f (x₁ - x₂) = 0, by rewrite [hom_sub, this, sub_self],
have x₁ - x₂ = 0, from H _ this,
eq_of_sub_eq_zero this
@ -124,7 +124,7 @@ section group_A_B
injective f :=
take x₁ x₂,
suppose f x₁ = f x₂,
have f (x₁ * x₂⁻¹) = 1, using this, by rewrite [hom_mul, hom_inv, this, mul.right_inv],
have f (x₁ * x₂⁻¹) = 1, by rewrite [hom_mul, hom_inv, this, mul.right_inv],
have x₁ * x₂⁻¹ = 1, from H _ this,
eq_of_mul_inv_eq_one this

View file

@ -0,0 +1,418 @@
/-
Copyright (c) 2016 Jeremy Avigad. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Jeremy Avigad
Weak and strict order preserving maps.
TODO: we will probably eventually want versions restricted to smaller domains,
"nondecreasing_on" etc. Maybe we can do this with subtypes.
-/
import .order
open eq eq.ops function
variables {A B C : Type}
section
variables [weak_order A] [weak_order B] [weak_order C]
definition nondecreasing (f : A → B) : Prop := ∀ ⦃a₁ a₂⦄, a₁ ≤ a₂ → f a₁ ≤ f a₂
definition nonincreasing (f : A → B) : Prop := ∀ ⦃a₁ a₂⦄, a₁ ≤ a₂ → f a₁ ≥ f a₂
theorem nondecreasing_id : nondecreasing (@id A) := take a₁ a₂, assume H, H
theorem nondecreasing_comp_nondec_nondec {g : B → C} {f : A → B}
(Hg : nondecreasing g) (Hf : nondecreasing f) : nondecreasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
theorem nondecreasing_comp_noninc_noninc {g : B → C} {f : A → B}
(Hg : nonincreasing g) (Hf : nonincreasing f) : nondecreasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
theorem nonincreasing_comp_noninc_nondec {g : B → C} {f : A → B}
(Hg : nonincreasing g) (Hf : nondecreasing f) : nonincreasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
theorem nonincreasing_comp_nondec_noninc {g : B → C} {f : A → B}
(Hg : nondecreasing g) (Hf : nonincreasing f) : nonincreasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
end
section
variables [strict_order A] [strict_order B] [strict_order C]
definition strictly_increasing (f : A → B) : Prop :=
∀ ⦃a₁ a₂⦄, a₁ < a₂ → f a₁ < f a₂
definition strictly_decreasing (f : A → B) : Prop :=
∀ ⦃a₁ a₂⦄, a₁ < a₂ → f a₁ > f a₂
theorem strictly_increasing_id : strictly_increasing (@id A) := take a₁ a₂, assume H, H
theorem strictly_increasing_comp_inc_inc {g : B → C} {f : A → B}
(Hg : strictly_increasing g) (Hf : strictly_increasing f) : strictly_increasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
theorem strictly_increasing_comp_dec_dec {g : B → C} {f : A → B}
(Hg : strictly_decreasing g) (Hf : strictly_decreasing f) : strictly_increasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
theorem strictly_decreasing_comp_inc_dec {g : B → C} {f : A → B}
(Hg : strictly_increasing g) (Hf : strictly_decreasing f) : strictly_decreasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
theorem strictly_decreasing_comp_dec_inc {g : B → C} {f : A → B}
(Hg : strictly_decreasing g) (Hf : strictly_increasing f) : strictly_decreasing (g ∘ f) :=
take a₁ a₂, assume H, Hg (Hf H)
end
section
variables [strong_order_pair A] [strong_order_pair B]
theorem nondecreasing_of_strictly_increasing {f : A → B} (H : strictly_increasing f) :
nondecreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
show f a₁ ≤ f a₂, from or.elim (lt_or_eq_of_le this)
(suppose a₁ < a₂, le_of_lt (H this))
(suppose a₁ = a₂, le_of_eq (congr_arg f this))
theorem nonincreasing_of_strictly_decreasing {f : A → B} (H : strictly_decreasing f) :
nonincreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
show f a₁ ≥ f a₂, from or.elim (lt_or_eq_of_le this)
(suppose a₁ < a₂, le_of_lt (H this))
(suppose a₁ = a₂, le_of_eq (congr_arg f this⁻¹))
end
section
variables [linear_strong_order_pair A] [linear_strong_order_pair B] [linear_strong_order_pair C]
theorem lt_of_strictly_increasing {f : A → B} {a₁ a₂ : A} (H : strictly_increasing f)
(H' : f a₁ < f a₂) : a₁ < a₂ :=
lt_of_not_ge (suppose a₂ ≤ a₁,
have f a₂ ≤ f a₁, from nondecreasing_of_strictly_increasing H this,
show false, from not_le_of_gt H' this)
theorem lt_iff_of_strictly_increasing {f : A → B} (a₁ a₂ : A) (H : strictly_increasing f) :
f a₁ < f a₂ ↔ a₁ < a₂ :=
iff.intro (lt_of_strictly_increasing H) (@H a₁ a₂)
theorem le_of_strictly_increasing {f : A → B} {a₁ a₂ : A} (H : strictly_increasing f)
(H' : f a₁ ≤ f a₂) : a₁ ≤ a₂ :=
le_of_not_gt (suppose a₂ < a₁, not_le_of_gt (H this) H')
theorem le_iff_of_strictly_increasing {f : A → B} (a₁ a₂ : A) (H : strictly_increasing f) :
f a₁ ≤ f a₂ ↔ a₁ ≤ a₂ :=
iff.intro (le_of_strictly_increasing H) (λ H', nondecreasing_of_strictly_increasing H H')
theorem lt_of_strictly_decreasing {f : A → B} {a₁ a₂ : A} (H : strictly_decreasing f)
(H' : f a₁ > f a₂) : a₁ < a₂ :=
lt_of_not_ge (suppose a₂ ≤ a₁,
have f a₂ ≥ f a₁, from nonincreasing_of_strictly_decreasing H this,
show false, from not_le_of_gt H' this)
theorem gt_iff_of_strictly_decreasing {f : A → B} (a₁ a₂ : A) (H : strictly_decreasing f) :
f a₁ > f a₂ ↔ a₁ < a₂ :=
iff.intro (lt_of_strictly_decreasing H) (@H a₁ a₂)
theorem le_of_strictly_decreasing {f : A → B} {a₁ a₂ : A} (H : strictly_decreasing f)
(H' : f a₁ ≥ f a₂) : a₁ ≤ a₂ :=
le_of_not_gt (suppose a₂ < a₁, not_le_of_gt (H this) H')
theorem ge_iff_of_strictly_decreasing {f : A → B} (a₁ a₂ : A) (H : strictly_decreasing f) :
f a₁ ≥ f a₂ ↔ a₁ ≤ a₂ :=
iff.intro (le_of_strictly_decreasing H) (λ H', nonincreasing_of_strictly_decreasing H H')
theorem strictly_increasing_of_left_inverse {g : B → A} {f : A → B} (H : left_inverse g f)
(H' : strictly_increasing g) : strictly_increasing f :=
take a₁ a₂, suppose a₁ < a₂,
have g (f a₁) < g (f a₂), by rewrite *H; apply this,
lt_of_strictly_increasing H' this
theorem strictly_decreasing_of_left_inverse {g : B → A} {f : A → B} (H : left_inverse g f)
(H' : strictly_decreasing g) : strictly_decreasing f :=
take b₁ b₂, suppose b₁ < b₂,
have g (f b₁) < g (f b₂), by rewrite *H; apply this,
lt_of_strictly_decreasing H' this
theorem nondecreasing_of_left_inverse {g : B → A} {f : A → B} (H : left_inverse g f)
(H' : strictly_increasing g) : nondecreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have g (f a₁) ≤ g (f a₂), by rewrite *H; apply this,
le_of_strictly_increasing H' this
theorem nonincreasing_of_left_inverse {g : B → A} {f : A → B} (H : left_inverse g f)
(H' : strictly_decreasing g) : nonincreasing f :=
take b₁ b₂, suppose b₁ ≤ b₂,
have g (f b₁) ≤ g (f b₂), by rewrite *H; apply this,
le_of_strictly_decreasing H' this
end
/- composition rules for strict orders -/
section
variables [strict_order A] [strict_order B] [strict_order C]
theorem strictly_increasing_of_strictly_increasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_increasing h) (H₃ : strictly_increasing (g ∘ f)) :
strictly_increasing f :=
take a₁ a₂, suppose a₁ < a₂,
have h (g (f a₁)) < h (g (f a₂)), from H₂ (H₃ this),
show f a₁ < f a₂, by rewrite *H₁ at this; apply this
theorem strictly_decreasing_of_strictly_increasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_decreasing h) (H₃ : strictly_increasing (g ∘ f)) :
strictly_decreasing f :=
take a₁ a₂, suppose a₁ < a₂,
have h (g (f a₁)) > h (g (f a₂)), from H₂ (H₃ this),
show f a₁ > f a₂, by rewrite *H₁ at this; apply this
theorem strictly_decreasing_of_strictly_decreasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_increasing h) (H₃ : strictly_decreasing (g ∘ f)) :
strictly_decreasing f :=
take a₁ a₂, suppose a₁ < a₂,
have h (g (f a₁)) > h (g (f a₂)), from H₂ (H₃ this),
show f a₁ > f a₂, by rewrite *H₁ at this; apply this
theorem strictly_increasing_of_strictly_decreasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_decreasing h) (H₃ : strictly_decreasing (g ∘ f)) :
strictly_increasing f :=
take a₁ a₂, suppose a₁ < a₂,
have h (g (f a₁)) < h (g (f a₂)), from H₂ (H₃ this),
show f a₁ < f a₂, by rewrite *H₁ at this; apply this
theorem strictly_increasing_of_strictly_decreasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_decreasing h) (H₃ : strictly_decreasing (g ∘ f)) :
strictly_increasing g :=
take a₁ a₂, suppose a₁ < a₂,
have g (f (h a₁)) < g (f (h a₂)), from H₃ (H₂ this),
show g a₁ < g a₂, by rewrite *H₁ at this; apply this
theorem strictly_decreasing_of_strictly_decreasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_increasing h) (H₃ : strictly_decreasing (g ∘ f)) :
strictly_decreasing g :=
take a₁ a₂, suppose a₁ < a₂,
have g (f (h a₁)) > g (f (h a₂)), from H₃ (H₂ this),
show g a₁ > g a₂, by rewrite *H₁ at this; apply this
theorem strictly_increasing_of_strictly_increasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_increasing h) (H₃ : strictly_increasing (g ∘ f)) :
strictly_increasing g :=
take a₁ a₂, suppose a₁ < a₂,
have g (f (h a₁)) < g (f (h a₂)), from H₃ (H₂ this),
show g a₁ < g a₂, by rewrite *H₁ at this; apply this
theorem strictly_decreasing_of_strictly_increasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_decreasing h) (H₃ : strictly_increasing (g ∘ f)) :
strictly_decreasing g :=
take a₁ a₂, suppose a₁ < a₂,
have g (f (h a₁)) > g (f (h a₂)), from H₃ (H₂ this),
show g a₁ > g a₂, by rewrite *H₁ at this; apply this
end
section
variables [strict_order A] [linear_strong_order_pair B] [linear_strong_order_pair C]
theorem strictly_increasing_comp_iff_strictly_increasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_increasing h) :
strictly_increasing (g ∘ f) ↔ strictly_increasing f :=
have H₃ : strictly_increasing g, from strictly_increasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_increasing_of_strictly_increasing_comp_right H₁ H₂)
(strictly_increasing_comp_inc_inc H₃)
theorem strictly_increasing_comp_iff_strictly_decreasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_decreasing h) :
strictly_increasing (g ∘ f) ↔ strictly_decreasing f :=
have H₃ : strictly_decreasing g, from strictly_decreasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_decreasing_of_strictly_increasing_comp_right H₁ H₂)
(strictly_increasing_comp_dec_dec H₃)
theorem strictly_decreasing_comp_iff_strictly_decreasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_increasing h) :
strictly_decreasing (g ∘ f) ↔ strictly_decreasing f :=
have H₃ : strictly_increasing g, from strictly_increasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_decreasing_of_strictly_decreasing_comp_right H₁ H₂)
(strictly_decreasing_comp_inc_dec H₃)
theorem strictly_decreasing_comp_iff_strictly_increasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_decreasing h) :
strictly_decreasing (g ∘ f) ↔ strictly_increasing f :=
have H₃ : strictly_decreasing g, from strictly_decreasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_increasing_of_strictly_decreasing_comp_right H₁ H₂)
(strictly_decreasing_comp_dec_inc H₃)
end
section
variables [linear_strong_order_pair A] [linear_strong_order_pair B] [strict_order C]
theorem strictly_increasing_comp_iff_strinctly_increasing_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_increasing f) :
strictly_increasing (g ∘ f) ↔ strictly_increasing g :=
have H₃ : strictly_increasing h, from strictly_increasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_increasing_of_strictly_increasing_comp_left H₁ H₃)
(λ H, strictly_increasing_comp_inc_inc H H₂)
theorem strictly_increasing_comp_iff_strictly_decreasing_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_decreasing f) :
strictly_increasing (g ∘ f) ↔ strictly_decreasing g :=
have H₃ : strictly_decreasing h, from strictly_decreasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_decreasing_of_strictly_increasing_comp_left H₁ H₃)
(λ H, strictly_increasing_comp_dec_dec H H₂)
theorem strictly_decreasing_comp_iff_strictly_increasing_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_decreasing f) :
strictly_decreasing (g ∘ f) ↔ strictly_increasing g :=
have H₃ : strictly_decreasing h, from strictly_decreasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_increasing_of_strictly_decreasing_comp_left H₁ H₃)
(λ H, strictly_decreasing_comp_inc_dec H H₂)
theorem strictly_decreasing_comp_iff_strictly_decreasing_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_increasing f) :
strictly_decreasing (g ∘ f) ↔ strictly_decreasing g :=
have H₃ : strictly_increasing h, from strictly_increasing_of_left_inverse H₁ H₂,
iff.intro
(strictly_decreasing_of_strictly_decreasing_comp_left H₁ H₃)
(λ H, strictly_decreasing_comp_dec_inc H H₂)
end
/- composition rules for weak orders -/
section
variables [weak_order A] [weak_order B] [weak_order C]
theorem nondecreasing_of_nondecreasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : nondecreasing h) (H₃ : nondecreasing (g ∘ f)) :
nondecreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have h (g (f a₁)) ≤ h (g (f a₂)), from H₂ (H₃ this),
show f a₁ ≤ f a₂, by rewrite *H₁ at this; apply this
theorem nonincreasing_of_nondecreasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : nonincreasing h) (H₃ : nondecreasing (g ∘ f)) :
nonincreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have h (g (f a₁)) ≥ h (g (f a₂)), from H₂ (H₃ this),
show f a₁ ≥ f a₂, by rewrite *H₁ at this; apply this
theorem nonincreasing_of_nonincreasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : nondecreasing h) (H₃ : nonincreasing (g ∘ f)) :
nonincreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have h (g (f a₁)) ≥ h (g (f a₂)), from H₂ (H₃ this),
show f a₁ ≥ f a₂, by rewrite *H₁ at this; apply this
theorem nondecreasing_of_nonincreasing_comp_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : nonincreasing h) (H₃ : nonincreasing (g ∘ f)) :
nondecreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have h (g (f a₁)) ≤ h (g (f a₂)), from H₂ (H₃ this),
show f a₁ ≤ f a₂, by rewrite *H₁ at this; apply this
theorem nondecreasing_of_nondecreasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : nondecreasing h) (H₃ : nondecreasing (g ∘ f)) :
nondecreasing g :=
take a₁ a₂, suppose a₁ ≤ a₂,
have g (f (h a₁)) ≤ g (f (h a₂)), from H₃ (H₂ this),
show g a₁ ≤ g a₂, by rewrite *H₁ at this; apply this
theorem nonincreasing_of_nondecreasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : nonincreasing h) (H₃ : nondecreasing (g ∘ f)) :
nonincreasing g :=
take a₁ a₂, suppose a₁ ≤ a₂,
have g (f (h a₁)) ≥ g (f (h a₂)), from H₃ (H₂ this),
show g a₁ ≥ g a₂, by rewrite *H₁ at this; apply this
theorem nondecreasing_of_nonincreasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : nonincreasing h) (H₃ : nonincreasing (g ∘ f)) :
nondecreasing g :=
take a₁ a₂, suppose a₁ ≤ a₂,
have g (f (h a₁)) ≤ g (f (h a₂)), from H₃ (H₂ this),
show g a₁ ≤ g a₂, by rewrite *H₁ at this; apply this
theorem nonincreasing_of_nonincreasing_comp_left {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : nondecreasing h) (H₃ : nonincreasing (g ∘ f)) :
nonincreasing g :=
take a₁ a₂, suppose a₁ ≤ a₂,
have g (f (h a₁)) ≥ g (f (h a₂)), from H₃ (H₂ this),
show g a₁ ≥ g a₂, by rewrite *H₁ at this; apply this
end
section
variables [weak_order A] [linear_strong_order_pair B] [linear_strong_order_pair C]
theorem nondecreasing_comp_iff_nondecreasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_increasing h) :
nondecreasing (g ∘ f) ↔ nondecreasing f :=
have H₃ : nondecreasing g, from nondecreasing_of_left_inverse H₁ H₂,
iff.intro
(nondecreasing_of_nondecreasing_comp_right H₁ (nondecreasing_of_strictly_increasing H₂))
(nondecreasing_comp_nondec_nondec H₃)
theorem nondecreasing_comp_iff_nonincreasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_decreasing h) :
nondecreasing (g ∘ f) ↔ nonincreasing f :=
have H₃ : nonincreasing g, from nonincreasing_of_left_inverse H₁ H₂,
iff.intro
(nonincreasing_of_nondecreasing_comp_right H₁ (nonincreasing_of_strictly_decreasing H₂))
(nondecreasing_comp_noninc_noninc H₃)
theorem nonincreasing_comp_iff_nonincreasing_right {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_increasing h) :
nonincreasing (g ∘ f) ↔ nonincreasing f :=
have H₃ : nondecreasing g, from nondecreasing_of_left_inverse H₁ H₂,
iff.intro
(nonincreasing_of_nonincreasing_comp_right H₁ (nondecreasing_of_strictly_increasing H₂))
(nonincreasing_comp_nondec_noninc H₃)
theorem nonincreasing_comp_iff' {g : B → C} {f : A → B} {h : C → B}
(H₁ : left_inverse h g) (H₂ : strictly_decreasing h) :
nonincreasing (g ∘ f) ↔ nondecreasing f :=
have H₃ : nonincreasing g, from nonincreasing_of_left_inverse H₁ H₂,
iff.intro
(nondecreasing_of_nonincreasing_comp_right H₁ (nonincreasing_of_strictly_decreasing H₂))
(nonincreasing_comp_noninc_nondec H₃)
end
section
variables [linear_strong_order_pair A] [linear_strong_order_pair B] [weak_order C]
theorem nondecreasing_comp_iff'' {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_increasing f) :
nondecreasing (g ∘ f) ↔ nondecreasing g :=
have H₃ : nondecreasing h, from nondecreasing_of_left_inverse H₁ H₂,
iff.intro
(nondecreasing_of_nondecreasing_comp_left H₁ H₃)
(λ H, nondecreasing_comp_nondec_nondec H (nondecreasing_of_strictly_increasing H₂))
theorem nondecreasing_comp_iff''' {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_decreasing f) :
nondecreasing (g ∘ f) ↔ nonincreasing g :=
have H₃ : nonincreasing h, from nonincreasing_of_left_inverse H₁ H₂,
iff.intro
(nonincreasing_of_nondecreasing_comp_left H₁ H₃)
(λ H, nondecreasing_comp_noninc_noninc H (nonincreasing_of_strictly_decreasing H₂))
theorem nonincreasing_comp_iff'' {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_decreasing f) :
nonincreasing (g ∘ f) ↔ nondecreasing g :=
have H₃ : nonincreasing h, from nonincreasing_of_left_inverse H₁ H₂,
iff.intro
(nondecreasing_of_nonincreasing_comp_left H₁ H₃)
(λ H, nonincreasing_comp_nondec_noninc H (nonincreasing_of_strictly_decreasing H₂))
theorem nonincreasing_comp_iff''' {g : B → C} {f : A → B} {h : B → A}
(H₁ : left_inverse f h) (H₂ : strictly_increasing f) :
nonincreasing (g ∘ f) ↔ nonincreasing g :=
have H₃ : nondecreasing h, from nondecreasing_of_left_inverse H₁ H₂,
iff.intro
(nonincreasing_of_nonincreasing_comp_left H₁ H₃)
(λ H, nonincreasing_comp_noninc_nondec H (nondecreasing_of_strictly_increasing H₂))
end

View file

@ -6,9 +6,9 @@ Author: Jeremy Avigad
Weak orders "≤", strict orders "<", and structures that include both.
-/
import logic.eq logic.connectives algebra.binary algebra.priority
open eq eq.ops
open eq eq.ops function
variable {A : Type}
variables {A : Type}
/- weak orders -/
@ -18,8 +18,7 @@ structure weak_order [class] (A : Type) extends has_le A :=
(le_antisymm : ∀a b, le a b → le b a → a = b)
section
variable [s : weak_order A]
include s
variables [weak_order A]
theorem le.refl (a : A) : a ≤ a := !weak_order.le_refl
@ -38,8 +37,13 @@ end
structure linear_weak_order [class] (A : Type) extends weak_order A :=
(le_total : ∀a b, le a b le b a)
theorem le.total [s : linear_weak_order A] (a b : A) : a ≤ b b ≤ a :=
!linear_weak_order.le_total
section
variables [linear_weak_order A]
theorem le.total (a b : A) : a ≤ b b ≤ a := !linear_weak_order.le_total
theorem le_of_not_ge {a b : A} (H : ¬ a ≥ b) : a ≤ b := or.resolve_left !le.total H
end
/- strict orders -/
@ -48,8 +52,7 @@ structure strict_order [class] (A : Type) extends has_lt A :=
(lt_trans : ∀a b c, lt a b → lt b c → lt a c)
section
variable [s : strict_order A]
include s
variable [strict_order A]
theorem lt.irrefl (a : A) : ¬ a < a := !strict_order.lt_irrefl
theorem not_lt_self (a : A) : ¬ a < a := !lt.irrefl -- alternate syntax
@ -131,55 +134,59 @@ structure strong_order_pair [class] (A : Type) extends weak_order A, has_lt A :=
(le_iff_lt_or_eq : ∀a b, le a b ↔ lt a b a = b)
(lt_irrefl : ∀ a, ¬ lt a a)
theorem le_iff_lt_or_eq [s : strong_order_pair A] {a b : A} : a ≤ b ↔ a < b a = b :=
!strong_order_pair.le_iff_lt_or_eq
section strong_order_pair
variable [strong_order_pair A]
theorem lt_or_eq_of_le [s : strong_order_pair A] {a b : A} (le_ab : a ≤ b) : a < b a = b :=
iff.mp le_iff_lt_or_eq le_ab
theorem le_iff_lt_or_eq {a b : A} : a ≤ b ↔ a < b a = b :=
!strong_order_pair.le_iff_lt_or_eq
theorem le_of_lt_or_eq [s : strong_order_pair A] {a b : A} (lt_or_eq : a < b a = b) : a ≤ b :=
iff.mpr le_iff_lt_or_eq lt_or_eq
theorem lt_or_eq_of_le {a b : A} (le_ab : a ≤ b) : a < b a = b :=
iff.mp le_iff_lt_or_eq le_ab
private theorem lt_irrefl' [s : strong_order_pair A] (a : A) : ¬ a < a :=
!strong_order_pair.lt_irrefl
theorem le_of_lt_or_eq {a b : A} (lt_or_eq : a < b a = b) : a ≤ b :=
iff.mpr le_iff_lt_or_eq lt_or_eq
private theorem le_of_lt' [s : strong_order_pair A] (a b : A) : a < b → a ≤ b :=
take Hlt, le_of_lt_or_eq (or.inl Hlt)
private theorem lt_irrefl' (a : A) : ¬ a < a :=
!strong_order_pair.lt_irrefl
private theorem lt_iff_le_and_ne [s : strong_order_pair A] {a b : A} : a < b ↔ (a ≤ b ∧ a ≠ b) :=
iff.intro
(take Hlt, and.intro (le_of_lt_or_eq (or.inl Hlt)) (take Hab, absurd (Hab ▸ Hlt) !lt_irrefl'))
(take Hand,
have Hor : a < b a = b, from lt_or_eq_of_le (and.left Hand),
or_resolve_left Hor (and.right Hand))
private theorem le_of_lt' (a b : A) : a < b → a ≤ b :=
take Hlt, le_of_lt_or_eq (or.inl Hlt)
theorem lt_of_le_of_ne [s : strong_order_pair A] {a b : A} : a ≤ b → a ≠ b → a < b :=
take H1 H2, iff.mpr lt_iff_le_and_ne (and.intro H1 H2)
private theorem lt_iff_le_and_ne {a b : A} : a < b ↔ (a ≤ b ∧ a ≠ b) :=
iff.intro
(take Hlt, and.intro (le_of_lt_or_eq (or.inl Hlt)) (take Hab, absurd (Hab ▸ Hlt) !lt_irrefl'))
(take Hand,
have Hor : a < b a = b, from lt_or_eq_of_le (and.left Hand),
or_resolve_left Hor (and.right Hand))
private theorem ne_of_lt' [s : strong_order_pair A] {a b : A} (H : a < b) : a ≠ b :=
and.right ((iff.mp lt_iff_le_and_ne) H)
theorem lt_of_le_of_ne {a b : A} : a ≤ b → a ≠ b → a < b :=
take H1 H2, iff.mpr lt_iff_le_and_ne (and.intro H1 H2)
private theorem lt_of_lt_of_le' [s : strong_order_pair A] (a b c : A) : a < b → b ≤ c → a < c :=
assume lt_ab : a < b,
assume le_bc : b ≤ c,
have le_ac : a ≤ c, from le.trans (le_of_lt' _ _ lt_ab) le_bc,
have ne_ac : a ≠ c, from
assume eq_ac : a = c,
have le_ba : b ≤ a, from eq_ac⁻¹ ▸ le_bc,
have eq_ab : a = b, from le.antisymm (le_of_lt' _ _ lt_ab) le_ba,
show false, from ne_of_lt' lt_ab eq_ab,
show a < c, from iff.mpr (lt_iff_le_and_ne) (and.intro le_ac ne_ac)
private theorem ne_of_lt' {a b : A} (H : a < b) : a ≠ b :=
and.right ((iff.mp lt_iff_le_and_ne) H)
theorem lt_of_le_of_lt' [s : strong_order_pair A] (a b c : A) : a ≤ b → b < c → a < c :=
assume le_ab : a ≤ b,
assume lt_bc : b < c,
have le_ac : a ≤ c, from le.trans le_ab (le_of_lt' _ _ lt_bc),
have ne_ac : a ≠ c, from
assume eq_ac : a = c,
have le_cb : c ≤ b, from eq_ac ▸ le_ab,
have eq_bc : b = c, from le.antisymm (le_of_lt' _ _ lt_bc) le_cb,
show false, from ne_of_lt' lt_bc eq_bc,
show a < c, from iff.mpr (lt_iff_le_and_ne) (and.intro le_ac ne_ac)
private theorem lt_of_lt_of_le' (a b c : A) : a < b → b ≤ c → a < c :=
assume lt_ab : a < b,
assume le_bc : b ≤ c,
have le_ac : a ≤ c, from le.trans (le_of_lt' _ _ lt_ab) le_bc,
have ne_ac : a ≠ c, from
assume eq_ac : a = c,
have le_ba : b ≤ a, from eq_ac⁻¹ ▸ le_bc,
have eq_ab : a = b, from le.antisymm (le_of_lt' _ _ lt_ab) le_ba,
show false, from ne_of_lt' lt_ab eq_ab,
show a < c, from iff.mpr (lt_iff_le_and_ne) (and.intro le_ac ne_ac)
theorem lt_of_le_of_lt' (a b c : A) : a ≤ b → b < c → a < c :=
assume le_ab : a ≤ b,
assume lt_bc : b < c,
have le_ac : a ≤ c, from le.trans le_ab (le_of_lt' _ _ lt_bc),
have ne_ac : a ≠ c, from
assume eq_ac : a = c,
have le_cb : c ≤ b, from eq_ac ▸ le_ab,
have eq_bc : b = c, from le.antisymm (le_of_lt' _ _ lt_bc) le_cb,
show false, from ne_of_lt' lt_bc eq_bc,
show a < c, from iff.mpr (lt_iff_le_and_ne) (and.intro le_ac ne_ac)
end strong_order_pair
definition strong_order_pair.to_order_pair [trans_instance]
[s : strong_order_pair A] : order_pair A :=
@ -201,9 +208,8 @@ definition linear_strong_order_pair.to_linear_order_pair [trans_instance]
⦃ linear_order_pair, s, strong_order_pair.to_order_pair ⦄
section
variable [s : linear_strong_order_pair A]
variable [linear_strong_order_pair A]
variables (a b c : A)
include s
theorem lt.trichotomy : a < b a = b b < a :=
or.elim (le.total a b)
@ -287,7 +293,6 @@ section
exact or.inr a_1
end
-- testing equality first may result in more definitional equalities
definition lt.cases {B : Type} (a b : A) (t_lt t_eq t_gt : B) : B :=
if a = b then t_eq else (if a < b then t_lt else t_gt)

View file

@ -7,10 +7,10 @@ Partially ordered additive groups, modeled on Isabelle's library. These classes
if necessary.
-/
import logic.eq data.unit data.sigma data.prod
import algebra.binary algebra.group algebra.order
import algebra.binary algebra.group algebra.order algebra.monotone
open eq eq.ops -- note: ⁻¹ will be overloaded
variable {A : Type}
variables {A B : Type}
/- partially ordered monoids, such as the natural numbers -/
@ -22,9 +22,8 @@ structure ordered_cancel_comm_monoid [class] (A : Type) extends add_comm_monoid
(lt_of_add_lt_add_left : ∀a b c, lt (add a b) (add a c) → lt b c)
section
variables [s : ordered_cancel_comm_monoid A]
variables [ordered_cancel_comm_monoid A]
variables {a b c d e : A}
include s
theorem add_lt_add_left (H : a < b) (c : A) : c + a < c + b :=
!ordered_cancel_comm_monoid.add_lt_add_left H c
@ -190,6 +189,18 @@ section
theorem add_lt_of_lt_of_neg (Hbc : b < c) (Ha : a < 0) : b + a < c :=
!add_zero ▸ add_lt_add Hbc Ha
theorem strictly_increasing_add_left (c : A) : strictly_increasing (λ x, x + c) :=
take x₁ x₂, assume H, add_lt_add_right H c
theorem strictly_increasing_add_right (c : A) : strictly_increasing (λ x, c + x) :=
take x₁ x₂, assume H, add_lt_add_left H c
theorem nondecreasing_add_left (c : A) : nondecreasing (λ x, x + c) :=
take x₁ x₂, assume H, add_le_add_right H c
theorem nondecreasing_add_right (c : A) : nondecreasing (λ x, c + x) :=
take x₁ x₂, assume H, add_le_add_left H c
end
/- ordered cancelative commutative monoids with a decidable linear order -/
@ -198,9 +209,8 @@ structure decidable_linear_ordered_cancel_comm_monoid [class] (A : Type)
extends ordered_cancel_comm_monoid A, decidable_linear_order A
section
variables [s : decidable_linear_ordered_cancel_comm_monoid A]
variables [decidable_linear_ordered_cancel_comm_monoid A]
variables {a b c d e : A}
include s
theorem min_add_add_left : min (a + b) (a + c) = a + min b c :=
eq.symm (eq_min
@ -257,8 +267,7 @@ definition ordered_comm_group.to_ordered_cancel_comm_monoid [trans_instance] [s
lt_of_add_lt_add_left := @ordered_comm_group.lt_of_add_lt_add_left A _⦄
section
variables [s : ordered_comm_group A] (a b c d e : A)
include s
variables [ordered_comm_group A] (a b c d e : A)
theorem neg_le_neg {a b : A} (H : a ≤ b) : -b ≤ -a :=
have H1 : 0 ≤ -a + b, from !add.left_inv ▸ !(add_le_add_left H),
@ -603,13 +612,127 @@ section
end
theorem sub_le_of_nonneg {b : A} (H : b ≥ 0) : a - b ≤ a :=
add_le_of_le_of_nonpos (le.refl a) (neg_nonpos_of_nonneg H)
add_le_of_le_of_nonpos (le.refl a) (neg_nonpos_of_nonneg H)
theorem sub_lt_of_pos {b : A} (H : b > 0) : a - b < a :=
add_lt_of_le_of_neg (le.refl a) (neg_neg_of_pos H)
add_lt_of_le_of_neg (le.refl a) (neg_neg_of_pos H)
theorem neg_add_neg_le_neg_of_pos {a : A} (H : a > 0) : -a + -a ≤ -a :=
!neg_add ▸ neg_le_neg (le_add_of_nonneg_left (le_of_lt H))
!neg_add ▸ neg_le_neg (le_add_of_nonneg_left (le_of_lt H))
variable (A)
theorem strictly_decreasing_neg : strictly_decreasing (λ x : A, -x) :=
@neg_lt_neg A _
variable {A}
section
variable [strict_order B]
theorem strictly_decreasing_neg_of_strictly_increasing {f : B → A}
(H : strictly_increasing f) : strictly_decreasing (λ x, - f x) :=
strictly_decreasing_comp_dec_inc (strictly_decreasing_neg A) H
theorem strictly_increasing_neg_of_strictly_decreasing {f : B → A}
(H : strictly_decreasing f) : strictly_increasing (λ x, - f x) :=
strictly_increasing_comp_dec_dec (strictly_decreasing_neg A) H
theorem strictly_decreasing_of_strictly_increasing_neg {f : B → A}
(H : strictly_increasing (λ x, - f x)) : strictly_decreasing f :=
strictly_decreasing_of_strictly_increasing_comp_right (left_inverse_neg A)
(strictly_decreasing_neg A) H
theorem strictly_increasing_of_strictly_decreasing_neg {f : B → A}
(H : strictly_decreasing (λ x, - f x)) : strictly_increasing f :=
strictly_increasing_of_strictly_decreasing_comp_right (left_inverse_neg A)
(strictly_decreasing_neg A) H
theorem strictly_decreasing_neg_iff {f : B → A} :
strictly_decreasing (λ x, - f x) ↔ strictly_increasing f :=
iff.intro strictly_increasing_of_strictly_decreasing_neg
strictly_decreasing_neg_of_strictly_increasing
theorem strictly_increasing_neg_iff {f : B → A} :
strictly_increasing (λ x, - f x) ↔ strictly_decreasing f :=
iff.intro strictly_decreasing_of_strictly_increasing_neg
strictly_increasing_neg_of_strictly_decreasing
theorem strictly_decreasing_neg_of_strictly_increasing' {f : A → B}
(H : strictly_increasing f) : strictly_decreasing (λ x, f (-x)) :=
strictly_decreasing_comp_inc_dec H (strictly_decreasing_neg A)
theorem strictly_increasing_neg_of_strictly_decreasing' {f : A → B}
(H : strictly_decreasing f) : strictly_increasing (λ x, f (-x)) :=
strictly_increasing_comp_dec_dec H (strictly_decreasing_neg A)
theorem strictly_decreasing_of_strictly_increasing_neg' {f : A → B}
(H : strictly_increasing (λ x, f (-x))) : strictly_decreasing f :=
strictly_decreasing_of_strictly_increasing_comp_left (left_inverse_neg A)
(strictly_decreasing_neg A) H
theorem strictly_increasing_of_strictly_decreasing_neg' {f : A → B}
(H : strictly_decreasing (λ x, f (-x))) : strictly_increasing f :=
strictly_increasing_of_strictly_decreasing_comp_left (left_inverse_neg A)
(strictly_decreasing_neg A) H
theorem strictly_decreasing_neg_iff' {f : A → B} :
strictly_decreasing (λ x, f (-x)) ↔ strictly_increasing f :=
iff.intro strictly_increasing_of_strictly_decreasing_neg'
strictly_decreasing_neg_of_strictly_increasing'
theorem strictly_increasing_neg_iff' {f : A → B} :
strictly_increasing (λ x, f (-x)) ↔ strictly_decreasing f :=
iff.intro strictly_decreasing_of_strictly_increasing_neg'
strictly_increasing_neg_of_strictly_decreasing'
end
section
variable [weak_order B]
theorem nondecreasing_of_neg_nonincreasing {f : B → A} (H : nonincreasing (λ x, -f x)) :
nondecreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂, le_of_neg_le_neg (H this)
theorem nonincreasing_neg {f : B → A} (H : nondecreasing f) : nonincreasing (λ x, -f x) :=
take a₁ a₂, suppose a₁ ≤ a₂, neg_le_neg (H this)
theorem nonincreasing_neg_iff (f : B → A) : nonincreasing (λ x, - f x) ↔ nondecreasing f :=
iff.intro nondecreasing_of_neg_nonincreasing nonincreasing_neg
theorem nonincreasing_of_neg_nondecreasing {f : B → A} (H : nondecreasing (λ x, -f x)) :
nonincreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂, le_of_neg_le_neg (H this)
theorem nondecreasing_neg {f : B → A} (H : nonincreasing f) : nondecreasing (λ x, -f x) :=
take a₁ a₂, suppose a₁ ≤ a₂, neg_le_neg (H this)
theorem nondecreasing_neg_iff (f : B → A) : nondecreasing (λ x, - f x) ↔ nonincreasing f :=
iff.intro nonincreasing_of_neg_nondecreasing nondecreasing_neg
theorem nondecreasing_of_neg_nonincreasing' {f : A → B} (H : nonincreasing (λ x, f (-x))) :
nondecreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have f(-(-a₁)) ≤ f(-(-a₂)), from H (neg_le_neg this),
by rewrite *neg_neg at this; exact this
theorem nonincreasing_neg' {f : A → B} (H : nondecreasing f) : nonincreasing (λ x, f (-x)) :=
take a₁ a₂, suppose a₁ ≤ a₂, H (neg_le_neg this)
theorem nonincreasing_neg_iff' (f : A → B) : nonincreasing (λ x, f (- x)) ↔ nondecreasing f :=
iff.intro nondecreasing_of_neg_nonincreasing' nonincreasing_neg'
theorem nonincreasing_of_neg_nondecreasing' {f : A → B} (H : nondecreasing (λ x, f (-x))) :
nonincreasing f :=
take a₁ a₂, suppose a₁ ≤ a₂,
have f(-(-a₁)) ≥ f(-(-a₂)), from H (neg_le_neg this),
by rewrite *neg_neg at this; exact this
theorem nondecreasing_neg' {f : A → B} (H : nonincreasing f) : nondecreasing (λ x, f (-x)) :=
take a₁ a₂, suppose a₁ ≤ a₂, H (neg_le_neg this)
theorem nondecreasing_neg_iff' (f : A → B) : nondecreasing (λ x, f (- x)) ↔ nonincreasing f :=
iff.intro nonincreasing_of_neg_nondecreasing' nondecreasing_neg'
end
end
/- linear ordered group with decidable order -/

View file

@ -228,6 +228,52 @@ lt.base n
lemma lt_succ_of_lt {i j : nat} : i < j → i < succ j :=
assume Plt, lt.trans Plt (self_lt_succ j)
/- increasing and decreasing functions -/
section
variables {A : Type} [strict_order A] {f : → A}
theorem strictly_increasing_of_forall_lt_succ (H : ∀ i, f i < f (succ i)) : strictly_increasing f :=
take i j,
nat.induction_on j
(suppose i < 0, absurd this !not_lt_zero)
(take j', assume ih, suppose i < succ j',
or.elim (lt_or_eq_of_le (le_of_lt_succ this))
(suppose i < j', lt.trans (ih this) (H j'))
(suppose i = j', by rewrite this; apply H))
theorem strictly_decreasing_of_forall_gt_succ (H : ∀ i, f i > f (succ i)) : strictly_decreasing f :=
take i j,
nat.induction_on j
(suppose i < 0, absurd this !not_lt_zero)
(take j', assume ih, suppose i < succ j',
or.elim (lt_or_eq_of_le (le_of_lt_succ this))
(suppose i < j', lt.trans (H j') (ih this))
(suppose i = j', by rewrite this; apply H))
end
section
variables {A : Type} [weak_order A] {f : → A}
theorem nondecreasing_of_forall_le_succ (H : ∀ i, f i ≤ f (succ i)) : nondecreasing f :=
take i j,
nat.induction_on j
(suppose i ≤ 0, have i = 0, from eq_zero_of_le_zero this, by rewrite this; apply le.refl)
(take j', assume ih, suppose i ≤ succ j',
or.elim (le_or_eq_succ_of_le_succ this)
(suppose i ≤ j', le.trans (ih this) (H j'))
(suppose i = succ j', by rewrite this; apply le.refl))
theorem nonincreasing_of_forall_ge_succ (H : ∀ i, f i ≥ f (succ i)) : nonincreasing f :=
take i j,
nat.induction_on j
(suppose i ≤ 0, have i = 0, from eq_zero_of_le_zero this, by rewrite this; apply le.refl)
(take j', assume ih, suppose i ≤ succ j',
or.elim (le_or_eq_succ_of_le_succ this)
(suppose i ≤ j', le.trans (H j') (ih this))
(suppose i = succ j', by rewrite this; apply le.refl))
end
/- other forms of induction -/
protected definition strong_rec_on {P : nat → Type} (n : ) (H : ∀n, (∀m, m < n → P m) → P n) : P n :=
@ -458,7 +504,6 @@ section least_and_greatest
rewrite Heq at Hi,
apply absurd (least_of_bound P Hi) Pnsm
end
theorem least_lt {n i : } (ltin : i < n) (Hi : P i) : least P n < n :=
lt_of_le_of_lt (ge_least_of_lt P ltin Hi) ltin

View file

@ -420,17 +420,6 @@ section monotone_sequences
open real set
variable {X : }
definition nondecreasing (X : ) : Prop := ∀ ⦃i j⦄, i ≤ j → X i ≤ X j
proposition nondecreasing_of_forall_le_succ (H : ∀ i, X i ≤ X (succ i)) : nondecreasing X :=
take i j, suppose i ≤ j,
have ∀ n, X i ≤ X (i + n), from
take n, nat.induction_on n
(by rewrite nat.add_zero; apply le.refl)
(take n, assume ih, le.trans ih (H (i + n))),
have X i ≤ X (i + (j - i)), from !this,
by rewrite [add_sub_of_le `i ≤ j` at this]; exact this
proposition converges_to_seq_sup_of_nondecreasing (nondecX : nondecreasing X) {b : }
(Hb : ∀ i, X i ≤ b) : X ⟶ sup (X ' univ) in :=
let sX := sup (X ' univ) in
@ -459,41 +448,6 @@ exists.intro i
have sX - X j < ε, from sub_lt_left_of_lt_add this,
show (abs (X j - sX)) < ε, by rewrite eq₁; exact this)
definition nonincreasing (X : ) : Prop := ∀ ⦃i j⦄, i ≤ j → X i ≥ X j
proposition nodecreasing_of_nonincreasing_neg (nonincX : nonincreasing (λ n, - X n)) :
nondecreasing (λ n, X n) :=
take i j, suppose i ≤ j,
show X i ≤ X j, from le_of_neg_le_neg (nonincX this)
proposition noincreasing_neg_of_nondecreasing (nondecX : nondecreasing X) :
nonincreasing (λ n, - X n) :=
take i j, suppose i ≤ j,
show - X i ≥ - X j, from neg_le_neg (nondecX this)
proposition nonincreasing_neg_iff (X : ) : nonincreasing (λ n, - X n) ↔ nondecreasing X :=
iff.intro nodecreasing_of_nonincreasing_neg noincreasing_neg_of_nondecreasing
proposition nonincreasing_of_nondecreasing_neg (nondecX : nondecreasing (λ n, - X n)) :
nonincreasing (λ n, X n) :=
take i j, suppose i ≤ j,
show X i ≥ X j, from le_of_neg_le_neg (nondecX this)
proposition nodecreasing_neg_of_nonincreasing (nonincX : nonincreasing X) :
nondecreasing (λ n, - X n) :=
take i j, suppose i ≤ j,
show - X i ≤ - X j, from neg_le_neg (nonincX this)
proposition nondecreasing_neg_iff (X : ) : nondecreasing (λ n, - X n) ↔ nonincreasing X :=
iff.intro nonincreasing_of_nondecreasing_neg nodecreasing_neg_of_nonincreasing
proposition nonincreasing_of_forall_succ_le (H : ∀ i, X (succ i) ≤ X i) : nonincreasing X :=
begin
rewrite -nondecreasing_neg_iff,
show nondecreasing (λ n : , - X n), from
nondecreasing_of_forall_le_succ (take i, neg_le_neg (H i))
end
proposition converges_to_seq_inf_of_nonincreasing (nonincX : nonincreasing X) {b : }
(Hb : ∀ i, b ≤ X i) : X ⟶ inf (X ' univ) in :=
have H₁ : ∃ x, x ∈ X ' univ, from exists.intro (X 0) (mem_image_of_mem X !mem_univ),
@ -527,7 +481,7 @@ let aX := (λ n, (abs x)^n),
iaX := real.inf (aX ' univ),
asX := (λ n, (abs x)^(succ n)) in
have noninc_aX : nonincreasing aX, from
nonincreasing_of_forall_succ_le
nonincreasing_of_forall_ge_succ
(take i,
have (abs x) * (abs x)^i ≤ 1 * (abs x)^i,
from mul_le_mul_of_nonneg_right (le_of_lt H) (!pow_nonneg_of_nonneg !abs_nonneg),