@@ -22,7 +22,7 @@ open nat
22
22
23
23
namespace list
24
24
25
- variables {α : Type u} {β : Type v} {R : α → α → Prop }
25
+ variables {α : Type u} {β : Type v} {R r : α → α → Prop } {l l₁ l₂ : list α} {a b : α }
26
26
27
27
mk_iff_of_inductive_prop list.chain list.chain_iff
28
28
@@ -105,21 +105,31 @@ begin
105
105
{ simp [H _ _ _ _ (rel_of_chain_cons hl₂), l_ih _ _ (chain_of_chain_cons hl₂)] }
106
106
end
107
107
108
- theorem chain_of_pairwise {a : α} {l : list α} (p : pairwise R (a :: l)) : chain R a l :=
108
+ protected lemma pairwise.chain (p : pairwise R (a :: l)) : chain R a l :=
109
109
begin
110
110
cases pairwise_cons.1 p with r p', clear p,
111
111
induction p' with b l r' p IH generalizing a, {exact chain.nil},
112
112
simp only [chain_cons, forall_mem_cons] at r,
113
113
exact chain_cons.2 ⟨r.1 , IH r'⟩
114
114
end
115
115
116
+ protected lemma chain.pairwise (tr : transitive R) :
117
+ ∀ {a : α} {l : list α}, chain R a l → pairwise R (a :: l)
118
+ | a [] chain.nil := pairwise_singleton _ _
119
+ | a _ (@chain.cons _ _ _ b l h hb) := hb.pairwise.cons begin
120
+ simp only [mem_cons_iff, forall_eq_or_imp, h, true_and],
121
+ exact λ c hc, tr h (rel_of_pairwise_cons hb.pairwise hc),
122
+ end
123
+
116
124
theorem chain_iff_pairwise (tr : transitive R) {a : α} {l : list α} :
117
125
chain R a l ↔ pairwise R (a :: l) :=
118
- ⟨λ c, begin
119
- induction c with b b c l r p IH, {exact pairwise_singleton _ _},
120
- apply IH.cons _, simp only [mem_cons_iff, forall_eq_or_imp, r, true_and],
121
- show ∀ x ∈ l, R b x, from λ x m, (tr r (rel_of_pairwise_cons IH m)),
122
- end , chain_of_pairwise⟩
126
+ ⟨chain.pairwise tr, pairwise.chain⟩
127
+
128
+ protected lemma chain.sublist [is_trans α R] (hl : l₂.chain R a) (h : l₁ <+ l₂) : l₁.chain R a :=
129
+ by { rw chain_iff_pairwise (transitive_of_trans R) at ⊢ hl, exact hl.sublist (h.cons_cons a) }
130
+
131
+ protected lemma chain.rel [is_trans α R] (hl : l.chain R a) (hb : b ∈ l) : R a b :=
132
+ by { rw chain_iff_pairwise (transitive_of_trans R) at hl, exact rel_of_pairwise_cons hl hb }
123
133
124
134
theorem chain_iff_nth_le {R} : ∀ {a : α} {l : list α},
125
135
chain R a l ↔ (∀ h : 0 < length l, R a (nth_le l 0 h)) ∧ (∀ i (h : i < length l - 1 ),
@@ -192,13 +202,16 @@ theorem chain'_map_of_chain' {S : β → β → Prop} (f : α → β)
192
202
193
203
theorem pairwise.chain' : ∀ {l : list α}, pairwise R l → chain' R l
194
204
| [] _ := trivial
195
- | (a :: l) h := chain_of_pairwise h
205
+ | (a :: l) h := pairwise.chain h
196
206
197
207
theorem chain'_iff_pairwise (tr : transitive R) : ∀ {l : list α},
198
208
chain' R l ↔ pairwise R l
199
209
| [] := (iff_true_intro pairwise.nil).symm
200
210
| (a :: l) := chain_iff_pairwise tr
201
211
212
+ protected lemma chain'.sublist [is_trans α R] (hl : l₂.chain' R) (h : l₁ <+ l₂) : l₁.chain' R :=
213
+ by { rw chain'_iff_pairwise (transitive_of_trans R) at ⊢ hl, exact hl.sublist h }
214
+
202
215
theorem chain'.cons {x y l} (h₁ : R x y) (h₂ : chain' R (y :: l)) :
203
216
chain' R (x :: y :: l) :=
204
217
chain'_cons.2 ⟨h₁, h₂⟩
@@ -289,7 +302,6 @@ lemma chain'.append_overlap : ∀ {l₁ l₂ l₃ : list α}
289
302
exact ⟨h₁.1 , chain'.append_overlap h₁.2 h₂ (cons_ne_nil _ _)⟩
290
303
end
291
304
292
- variables {r : α → α → Prop } {a b : α}
293
305
/--
294
306
If `a` and `b` are related by the reflexive transitive closure of `r`, then there is a `r`-chain
295
307
starting from `a` and ending on `b`.
0 commit comments