refactor(library/data/prod): cleanup

This commit is contained in:
Leonardo de Moura 2014-10-05 13:38:08 -07:00
parent 1306d08399
commit 86591c7272
4 changed files with 43 additions and 39 deletions

View file

@ -7,7 +7,7 @@
-- The integers, with addition, multiplication, and subtraction. -- The integers, with addition, multiplication, and subtraction.
import ..nat.basic ..nat.order ..nat.sub ..prod ..quotient ..quotient tools.tactic algebra.relation import data.nat.basic data.nat.order data.nat.sub data.prod data.quotient tools.tactic algebra.relation
import algebra.binary import algebra.binary
import tools.fake_simplifier import tools.fake_simplifier
@ -84,22 +84,22 @@ or.elim le_or_gt
theorem proj_ge_pr1 {a : × } (H : pr1 a ≥ pr2 a) : pr1 (proj a) = pr1 a - pr2 a := theorem proj_ge_pr1 {a : × } (H : pr1 a ≥ pr2 a) : pr1 (proj a) = pr1 a - pr2 a :=
calc calc
pr1 (proj a) = pr1 (pair (pr1 a - pr2 a) 0) : {proj_ge H} pr1 (proj a) = pr1 (pair (pr1 a - pr2 a) 0) : {proj_ge H}
... = pr1 a - pr2 a : pr1_pair (pr1 a - pr2 a) 0 ... = pr1 a - pr2 a : pr1.pair (pr1 a - pr2 a) 0
theorem proj_ge_pr2 {a : × } (H : pr1 a ≥ pr2 a) : pr2 (proj a) = 0 := theorem proj_ge_pr2 {a : × } (H : pr1 a ≥ pr2 a) : pr2 (proj a) = 0 :=
calc calc
pr2 (proj a) = pr2 (pair (pr1 a - pr2 a) 0) : {proj_ge H} pr2 (proj a) = pr2 (pair (pr1 a - pr2 a) 0) : {proj_ge H}
... = 0 : pr2_pair (pr1 a - pr2 a) 0 ... = 0 : pr2.pair (pr1 a - pr2 a) 0
theorem proj_le_pr1 {a : × } (H : pr1 a ≤ pr2 a) : pr1 (proj a) = 0 := theorem proj_le_pr1 {a : × } (H : pr1 a ≤ pr2 a) : pr1 (proj a) = 0 :=
calc calc
pr1 (proj a) = pr1 (pair 0 (pr2 a - pr1 a)) : {proj_le H} pr1 (proj a) = pr1 (pair 0 (pr2 a - pr1 a)) : {proj_le H}
... = 0 : pr1_pair 0 (pr2 a - pr1 a) ... = 0 : pr1.pair 0 (pr2 a - pr1 a)
theorem proj_le_pr2 {a : × } (H : pr1 a ≤ pr2 a) : pr2 (proj a) = pr2 a - pr1 a := theorem proj_le_pr2 {a : × } (H : pr1 a ≤ pr2 a) : pr2 (proj a) = pr2 a - pr1 a :=
calc calc
pr2 (proj a) = pr2 (pair 0 (pr2 a - pr1 a)) : {proj_le H} pr2 (proj a) = pr2 (pair 0 (pr2 a - pr1 a)) : {proj_le H}
... = pr2 a - pr1 a : pr2_pair 0 (pr2 a - pr1 a) ... = pr2 a - pr1 a : pr2.pair 0 (pr2 a - pr1 a)
theorem proj_flip (a : × ) : proj (flip a) = flip (proj a) := theorem proj_flip (a : × ) : proj (flip a) = flip (proj a) :=
have special : ∀a, pr2 a ≤ pr1 a → proj (flip a) = flip (proj a), from have special : ∀a, pr2 a ≤ pr1 a → proj (flip a) = flip (proj a), from

View file

@ -610,7 +610,7 @@ show lhs = rhs, from
... = rhs : (if_pos H1)⁻¹) ... = rhs : (if_pos H1)⁻¹)
(assume H1 : y ≠ 0, (assume H1 : y ≠ 0,
have ypos : y > 0, from ne_zero_imp_pos H1, have ypos : y > 0, from ne_zero_imp_pos H1,
have H2 : gcd_aux_measure p' = x mod y, from pr2_pair _ _, have H2 : gcd_aux_measure p' = x mod y, from pr2.pair _ _,
have H3 : gcd_aux_measure p' < gcd_aux_measure p, from H2⁻¹ ▸ mod_lt ypos, have H3 : gcd_aux_measure p' < gcd_aux_measure p, from H2⁻¹ ▸ mod_lt ypos,
calc calc
lhs = g1 p' : if_neg H1 lhs = g1 p' : if_neg H1

View file

@ -6,7 +6,7 @@ import logic.inhabited logic.eq logic.decidable
-- data.prod -- data.prod
-- ========= -- =========
open inhabited decidable open inhabited decidable eq.ops
-- The cartesian product. -- The cartesian product.
inductive prod (A B : Type) : Type := inductive prod (A B : Type) : Type :=
@ -21,39 +21,43 @@ notation `(` h `,` t:(foldl `,` (e r, prod.mk r e) h) `)` := t
namespace prod namespace prod
section section
parameters {A B : Type} parameters {A B : Type}
definition pr1 (p : prod A B) := rec (λ x y, x) p
definition pr2 (p : prod A B) := rec (λ x y, y) p
theorem pr1_pair (a : A) (b : B) : pr1 (a, b) = a :=
rfl
theorem pr2_pair (a : A) (b : B) : pr2 (a, b) = b :=
rfl
protected theorem destruct {P : A × B → Prop} (p : A × B) (H : ∀a b, P (a, b)) : P p := protected theorem destruct {P : A × B → Prop} (p : A × B) (H : ∀a b, P (a, b)) : P p :=
rec H p rec H p
theorem prod_ext (p : prod A B) : pair (pr1 p) (pr2 p) = p := definition pr1 (p : prod A B) := rec (λ x y, x) p
definition pr2 (p : prod A B) := rec (λ x y, y) p
notation `pr₁`:max := pr1
notation `pr₂`:max := pr2
variables (a : A) (b : B)
theorem pr1.pair : pr₁ (a, b) = a :=
rfl
theorem pr2.pair : pr₂ (a, b) = b :=
rfl
theorem prod_ext (p : prod A B) : pair (pr₁ p) (pr₂ p) = p :=
destruct p (λx y, eq.refl (x, y)) destruct p (λx y, eq.refl (x, y))
open eq.ops variables {a₁ a₂ : A} {b₁ b₂ : B}
theorem pair_eq {a1 a2 : A} {b1 b2 : B} (H1 : a1 = a2) (H2 : b1 = b2) : (a1, b1) = (a2, b2) := theorem pair_eq : a₁ = a₂ → b₁ = b₂ → (a₁, b₁) = (a₂, b₂) :=
H1 ▸ H2 ▸ rfl assume H1 H2, H1 ▸ H2 ▸ rfl
protected theorem equal {p1 p2 : prod A B} : ∀ (H1 : pr1 p1 = pr1 p2) (H2 : pr2 p1 = pr2 p2), p1 = p2 := protected theorem equal {p₁ p₂ : prod A B} : pr₁ p₁ = pr₁ p₂ → pr₂ p₁ = pr₂ p₂ → p₁ = p₂ :=
destruct p1 (take a1 b1, destruct p2 (take a2 b2 H1 H2, pair_eq H1 H2)) destruct p₁ (take a₁ b₁, destruct p₂ (take a₂ b₂ H₁ H₂, pair_eq H₁ H₂))
protected definition is_inhabited [instance] (H1 : inhabited A) (H2 : inhabited B) : inhabited (prod A B) := protected definition is_inhabited [instance] : inhabited A → inhabited B → inhabited (prod A B) :=
inhabited.destruct H1 (λa, inhabited.destruct H2 (λb, inhabited.mk (pair a b))) take (H₁ : inhabited A) (H₂ : inhabited B),
inhabited.destruct H₁ (λa, inhabited.destruct H₂ (λb, inhabited.mk (pair a b)))
protected definition has_decidable_eq [instance] (H1 : decidable_eq A) (H2 : decidable_eq B) : decidable_eq (A × B) := protected definition has_decidable_eq [instance] : decidable_eq A → decidable_eq B → decidable_eq (A × B) :=
take u v : A × B, take (H₁ : decidable_eq A) (H₂ : decidable_eq B) (u v : A × B),
have H3 : u = v ↔ (pr1 u = pr1 v) ∧ (pr2 u = pr2 v), from have H₃ : u = v ↔ (pr₁ u = pr₁ v) ∧ (pr₂ u = pr₂ v), from
iff.intro iff.intro
(assume H, H ▸ and.intro rfl rfl) (assume H, H ▸ and.intro rfl rfl)
(assume H, and.elim H (assume H4 H5, equal H4 H5)), (assume H, and.elim H (assume H₄ H₅, equal H₄ H₅)),
decidable_iff_equiv _ (iff.symm H3) decidable_iff_equiv _ (iff.symm H)
end end
end prod end prod

View file

@ -47,13 +47,13 @@ rfl
theorem map_pair_pair {A B : Type} (f : A → B) (a a' : A) theorem map_pair_pair {A B : Type} (f : A → B) (a a' : A)
: map_pair f (pair a a') = pair (f a) (f a') := : map_pair f (pair a a') = pair (f a) (f a') :=
(pr1_pair a a') ▸ (pr2_pair a a') ▸ (rfl) (pr1.pair a a') ▸ (pr2.pair a a') ▸ rfl
theorem map_pair_pr1 {A B : Type} (f : A → B) (a : A × A) : pr1 (map_pair f a) = f (pr1 a) := theorem map_pair_pr1 {A B : Type} (f : A → B) (a : A × A) : pr1 (map_pair f a) = f (pr1 a) :=
pr1_pair _ _ !pr1.pair
theorem map_pair_pr2 {A B : Type} (f : A → B) (a : A × A) : pr2 (map_pair f a) = f (pr2 a) := theorem map_pair_pr2 {A B : Type} (f : A → B) (a : A × A) : pr2 (map_pair f a) = f (pr2 a) :=
pr2_pair _ _ !pr2.pair
-- ### coordinatewise binary maps -- ### coordinatewise binary maps
@ -68,16 +68,16 @@ theorem map_pair2_pair {A B C : Type} (f : A → B → C) (a a' : A) (b b' : B)
calc calc
map_pair2 f (pair a a') (pair b b') map_pair2 f (pair a a') (pair b b')
= pair (f (pr1 (pair a a')) b) (f (pr2 (pair a a')) (pr2 (pair b b'))) = pair (f (pr1 (pair a a')) b) (f (pr2 (pair a a')) (pr2 (pair b b')))
: {pr1_pair b b'} : {pr1.pair b b'}
... = pair (f (pr1 (pair a a')) b) (f (pr2 (pair a a')) b') : {pr2_pair b b'} ... = pair (f (pr1 (pair a a')) b) (f (pr2 (pair a a')) b') : {pr2.pair b b'}
... = pair (f (pr1 (pair a a')) b) (f a' b') : {pr2_pair a a'} ... = pair (f (pr1 (pair a a')) b) (f a' b') : {pr2.pair a a'}
... = pair (f a b) (f a' b') : {pr1_pair a a'} ... = pair (f a b) (f a' b') : {pr1.pair a a'}
theorem map_pair2_pr1 {A B C : Type} (f : A → B → C) (a : A × A) (b : B × B) : theorem map_pair2_pr1 {A B C : Type} (f : A → B → C) (a : A × A) (b : B × B) :
pr1 (map_pair2 f a b) = f (pr1 a) (pr1 b) := pr1_pair _ _ pr1 (map_pair2 f a b) = f (pr1 a) (pr1 b) := !pr1.pair
theorem map_pair2_pr2 {A B C : Type} (f : A → B → C) (a : A × A) (b : B × B) : theorem map_pair2_pr2 {A B C : Type} (f : A → B → C) (a : A × A) (b : B × B) :
pr2 (map_pair2 f a b) = f (pr2 a) (pr2 b) := pr2_pair _ _ pr2 (map_pair2 f a b) = f (pr2 a) (pr2 b) := !pr2.pair
theorem map_pair2_flip {A B C : Type} (f : A → B → C) (a : A × A) (b : B × B) : theorem map_pair2_flip {A B C : Type} (f : A → B → C) (a : A × A) (b : B × B) :
flip (map_pair2 f a b) = map_pair2 f (flip a) (flip b) := flip (map_pair2 f a b) = map_pair2 f (flip a) (flip b) :=