@@ -6,7 +6,7 @@ Authors: Johannes Hölzl
6
6
Relator for functions, pairs, sums, and lists.
7
7
-/
8
8
9
- import tactic.reserved_notation
9
+ import logic.basic
10
10
11
11
namespace relator
12
12
universe variables u₁ u₂ v₁ v₂
@@ -30,50 +30,40 @@ infixr ⇒ := lift_fun
30
30
31
31
end
32
32
33
- section
34
- variables {α : Type u₁} {β : out_param $ Type u₂} (R : out_param $ α → β → Prop )
35
-
36
- class right_total : Prop := (right : ∀b, ∃a, R a b)
37
- class left_total : Prop := (left : ∀a, ∃b, R a b)
38
- class bi_total extends left_total R, right_total R : Prop
39
-
40
- end
41
-
42
33
section
43
34
variables {α : Type u₁} {β : Type u₂} (R : α → β → Prop )
44
35
45
- class left_unique : Prop := (left : ∀{a b c}, R a b → R c b → a = c)
46
- class right_unique : Prop := (right : ∀{a b c}, R a b → R a c → b = c)
36
+ def right_total : Prop := ∀ b, ∃ a, R a b
37
+ def left_total : Prop := ∀ a, ∃ b, R a b
38
+ def bi_total : Prop := left_total R ∧ right_total R
47
39
48
- lemma left_unique.unique {R : α → β → Prop } (h : left_unique R) {a b c} :
49
- R a b → R c b → a = c := left_unique.left β
40
+ def left_unique : Prop := ∀ ⦃a b c⦄, R a c → R b c → a = b
41
+ def right_unique : Prop := ∀ ⦃a b c⦄, R a b → R a c → b = c
42
+ def bi_unique : Prop := left_unique R ∧ right_unique R
50
43
51
- lemma right_unique.unique {R : α → β → Prop } (h : right_unique R) {a b c} :
52
- R a b → R a c → b = c := right_unique.right α
44
+ variable {R}
53
45
54
- lemma rel_forall_of_right_total [ right_total R] :
46
+ lemma right_total.rel_forall (h : right_total R) :
55
47
((R ⇒ implies) ⇒ implies) (λp, ∀i, p i) (λq, ∀i, q i) :=
56
- assume p q Hrel H b, exists.elim (right_total.right b) (assume a Rab, Hrel Rab (H _))
48
+ assume p q Hrel H b, exists.elim (h b) (assume a Rab, Hrel Rab (H _))
57
49
58
- lemma rel_exists_of_left_total [ left_total R] :
50
+ lemma left_total.rel_exists (h : left_total R) :
59
51
((R ⇒ implies) ⇒ implies) (λp, ∃i, p i) (λq, ∃i, q i) :=
60
- assume p q Hrel ⟨a, pa⟩, let ⟨b, Rab⟩ := left_total.left a in ⟨b , Hrel Rab pa⟩
52
+ assume p q Hrel ⟨a, pa⟩, (h a).imp $ λ b Rab , Hrel Rab pa
61
53
62
- lemma rel_forall_of_total [bi_total R] : ((R ⇒ iff) ⇒ iff) (λp, ∀i, p i) (λq, ∀i, q i) :=
54
+ lemma bi_total.rel_forall (h : bi_total R) :
55
+ ((R ⇒ iff) ⇒ iff) (λp, ∀i, p i) (λq, ∀i, q i) :=
63
56
assume p q Hrel,
64
- ⟨assume H b, exists.elim (right_total .right b) (assume a Rab, (Hrel Rab).mp (H _)),
65
- assume H a, exists.elim (left_total .left a) (assume b Rab, (Hrel Rab).mpr (H _))⟩
57
+ ⟨assume H b, exists.elim (h .right b) (assume a Rab, (Hrel Rab).mp (H _)),
58
+ assume H a, exists.elim (h .left a) (assume b Rab, (Hrel Rab).mpr (H _))⟩
66
59
67
- lemma rel_exists_of_total [ bi_total R] : ((R ⇒ iff) ⇒ iff) (λp, ∃i, p i) (λq, ∃i, q i) :=
60
+ lemma bi_total.rel_exists (h : bi_total R) : ((R ⇒ iff) ⇒ iff) (λp, ∃i, p i) (λq, ∃i, q i) :=
68
61
assume p q Hrel,
69
- ⟨assume ⟨a, pa⟩, let ⟨b, Rab⟩ := left_total .left a in ⟨b , (Hrel Rab).1 pa⟩ ,
70
- assume ⟨b, qb⟩, let ⟨a, Rab⟩ := right_total .right b in ⟨a , (Hrel Rab).2 qb⟩ ⟩
62
+ ⟨assume ⟨a, pa⟩, (h .left a).imp $ λ b Rab , (Hrel Rab).1 pa,
63
+ assume ⟨b, qb⟩, (h .right b).imp $ λ a Rab , (Hrel Rab).2 qb⟩
71
64
72
65
lemma left_unique_of_rel_eq {eq' : β → β → Prop } (he : (R ⇒ (R ⇒ iff)) eq eq') : left_unique R :=
73
- ⟨λ a b c (ab : R a b) (cb : R c b),
74
- have eq' b b,
75
- from iff.mp (he ab ab) rfl,
76
- iff.mpr (he ab cb) this ⟩
66
+ λ a b c (ac : R a c) (bc : R b c), (he ac bc).mpr ((he bc bc).mp rfl)
77
67
78
68
end
79
69
@@ -83,18 +73,14 @@ assume p q h r s l, imp_congr h l
83
73
lemma rel_not : (iff ⇒ iff) not not :=
84
74
assume p q h, not_congr h
85
75
86
- @[priority 100 ] -- see Note [lower instance priority]
87
- -- (this is an instance is always applies, since the relation is an out-param)
88
- instance bi_total_eq {α : Type u₁} : relator.bi_total (@eq α) :=
76
+ lemma bi_total_eq {α : Type u₁} : relator.bi_total (@eq α) :=
89
77
{ left := λ a, ⟨a, rfl⟩, right := λ a, ⟨a, rfl⟩ }
90
78
91
79
variables {α : Type *} {β : Type *} {γ : Type *} {δ : Type *}
92
80
variables {r : α → β → Prop } {p : β → γ → Prop } {q : γ → δ → Prop }
93
81
94
- class bi_unique (r : α → β → Prop ) extends left_unique r, right_unique r : Prop
95
-
96
- lemma left_unique_flip : left_unique r → right_unique (flip r)
97
- | ⟨h⟩ := ⟨λ a b c h₁ h₂, h h₁ h₂⟩
82
+ lemma left_unique.flip (h : left_unique r) : right_unique (flip r) :=
83
+ λ a b c h₁ h₂, h h₁ h₂
98
84
99
85
lemma rel_and : ((↔) ⇒ (↔) ⇒ (↔)) (∧) (∧) :=
100
86
assume a b h₁ c d h₂, and_congr h₁ h₂
@@ -108,7 +94,7 @@ assume a b h₁ c d h₂, iff_congr h₁ h₂
108
94
lemma rel_eq {r : α → β → Prop } (hr : bi_unique r) : (r ⇒ r ⇒ (↔)) (=) (=) :=
109
95
assume a b h₁ c d h₂,
110
96
iff.intro
111
- begin intro h, subst h, exact right_unique .right α h₁ h₂ end
112
- begin intro h, subst h, exact left_unique .left β h₁ h₂ end
97
+ begin intro h, subst h, exact hr .right h₁ h₂ end
98
+ begin intro h, subst h, exact hr .left h₁ h₂ end
113
99
114
100
end relator
0 commit comments