2
2
Copyright (c) 2018 Johannes Hölzl. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Johannes Hölzl
5
-
6
- Transitive reflexive as well as reflexive closure of relations.
7
5
-/
8
6
import tactic.basic
9
7
10
- variables {α : Type *} {β : Type *} {γ : Type *} {δ : Type *}
8
+ /-!
9
+ # Relation closures
10
+
11
+ This file defines the reflexive, transitive, and reflexive transitive closures of relations.
12
+ It also proves some basic results on definitions in core, such as `eqv_gen`.
13
+
14
+ Note that this is about unbundled relations, that is terms of types of the form `α → β → Prop`. For
15
+ the bundled version, see `rel`.
16
+
17
+ ## Definitions
18
+
19
+ * `relation.refl_gen`: Reflexive closure. `refl_gen r` relates everything `r` related, plus for all
20
+ `a` it relates `a` with itself. So `refl_gen r a b ↔ r a b ∨ a = b`.
21
+ * `relation.trans_gen`: Transitive closure. `trans_gen r` relates everything `r` related
22
+ transitively. So `trans_gen r a b ↔ ∃ x₀ ... xₙ, r a x₀ ∧ r x₀ x₁ ∧ ... ∧ r xₙ b`.
23
+ * `relation.refl_trans_gen`: Reflexive transitive closure. `refl_trans_gen r` relates everything
24
+ `r` related transitively, plus for all `a` it relates `a` with itself. So
25
+ `refl_trans_gen r a b ↔ (∃ x₀ ... xₙ, r a x₀ ∧ r x₀ x₁ ∧ ... ∧ r xₙ b) ∨ a = b`. It is the same as
26
+ the reflexive closure of the transitive closure, or the transitive closure of the reflexive
27
+ closure. In terms of rewriting systems, this means that `a` can be rewritten to `b` in a number of
28
+ rewrites.
29
+ * `relation.comp`: Relation composition. We provide notation `∘r`. For `r : α → β → Prop` and
30
+ `s : β → γ → Prop`, `r ∘r s`relates `a : α` and `c : γ` iff there exists `b : β` that's related to
31
+ both.
32
+ * `relation.map`: Image of a relation under a pair of maps. For `r : α → β → Prop`, `f : α → γ`,
33
+ `g : β → δ`, `map r f g` is the relation `γ → δ → Prop` relating `f a` and `g b` for all `a`, `b`
34
+ related by `r`.
35
+ * `relation.join`: Join of a relation. For `r : α → α → Prop`, `join r a b ↔ ∃ c, r a c ∧ r b c`. In
36
+ terms of rewriting systems, this means that `a` and `b` can be rewritten to the same term.
37
+ -/
38
+
39
+ variables {α β γ δ : Type *}
11
40
12
41
section ne_imp
13
42
@@ -66,19 +95,19 @@ The composition of two relations, yielding a new relation. The result
66
95
relates a term of `α` and a term of `γ` if there is an intermediate
67
96
term of `β` related to both.
68
97
-/
69
- def comp (r : α → β → Prop ) (p : β → γ → Prop ) (a : α) (c : γ) : Prop := ∃b, r a b ∧ p b c
98
+ def comp (r : α → β → Prop ) (p : β → γ → Prop ) (a : α) (c : γ) : Prop := ∃ b, r a b ∧ p b c
70
99
71
100
local infixr ` ∘r ` : 80 := relation.comp
72
101
73
102
lemma comp_eq : r ∘r (=) = r :=
74
- funext $ assume a, funext $ assume b, propext $ iff.intro
75
- (assume ⟨c, h, eq⟩, eq ▸ h)
76
- (assume h, ⟨b, h, rfl⟩)
103
+ funext $ λ a, funext $ λ b, propext $ iff.intro
104
+ (λ ⟨c, h, eq⟩, eq ▸ h)
105
+ (λ h, ⟨b, h, rfl⟩)
77
106
78
107
lemma eq_comp : (=) ∘r r = r :=
79
- funext $ assume a, funext $ assume b, propext $ iff.intro
80
- (assume ⟨c, eq, h⟩, eq.symm ▸ h)
81
- (assume h, ⟨a, rfl, h⟩)
108
+ funext $ λ a, funext $ λ b, propext $ iff.intro
109
+ (λ ⟨c, eq, h⟩, eq.symm ▸ h)
110
+ (λ h, ⟨a, rfl, h⟩)
82
111
83
112
lemma iff_comp {r : Prop → α → Prop } : (↔) ∘r r = r :=
84
113
have (↔) = (=), by funext a b; exact iff_eq_eq,
@@ -92,16 +121,16 @@ lemma comp_assoc : (r ∘r p) ∘r q = r ∘r p ∘r q :=
92
121
begin
93
122
funext a d, apply propext,
94
123
split,
95
- exact assume ⟨c, ⟨b, hab, hbc⟩, hcd⟩, ⟨b, hab, c, hbc, hcd⟩,
96
- exact assume ⟨b, hab, c, hbc, hcd⟩, ⟨c, ⟨b, hab, hbc⟩, hcd⟩
124
+ exact λ ⟨c, ⟨b, hab, hbc⟩, hcd⟩, ⟨b, hab, c, hbc, hcd⟩,
125
+ exact λ ⟨b, hab, c, hbc, hcd⟩, ⟨c, ⟨b, hab, hbc⟩, hcd⟩
97
126
end
98
127
99
128
lemma flip_comp : flip (r ∘r p) = (flip p) ∘r (flip r) :=
100
129
begin
101
130
funext c a, apply propext,
102
131
split,
103
- exact assume ⟨b, hab, hbc⟩, ⟨b, hbc, hab⟩,
104
- exact assume ⟨b, hbc, hab⟩, ⟨b, hab, hbc⟩
132
+ exact λ ⟨b, hab, hbc⟩, ⟨b, hbc, hab⟩,
133
+ exact λ ⟨b, hbc, hab⟩, ⟨b, hab, hbc⟩
105
134
end
106
135
107
136
end comp
@@ -113,7 +142,7 @@ defined by having pairs of terms related if they have preimages
113
142
related by `r`.
114
143
-/
115
144
protected def map (r : α → β → Prop ) (f : α → γ) (g : β → δ) : γ → δ → Prop :=
116
- λc d, ∃a b, r a b ∧ f a = c ∧ g b = d
145
+ λ c d, ∃ a b, r a b ∧ f a = c ∧ g b = d
117
146
118
147
variables {r : α → α → Prop } {a b c d : α}
119
148
@@ -137,7 +166,7 @@ attribute [refl] refl_trans_gen.refl
137
166
138
167
attribute [refl] refl_gen.refl
139
168
140
- lemma refl_gen.to_refl_trans_gen : ∀{a b}, refl_gen r a b → refl_trans_gen r a b
169
+ lemma refl_gen.to_refl_trans_gen : ∀ {a b}, refl_gen r a b → refl_trans_gen r a b
141
170
| a _ refl_gen.refl := by refl
142
171
| a b (refl_gen.single h) := refl_trans_gen.tail refl_trans_gen.refl h
143
172
@@ -169,33 +198,33 @@ begin
169
198
{ apply relation.refl_trans_gen.head (h b) c }
170
199
end
171
200
172
- lemma cases_tail : refl_trans_gen r a b → b = a ∨ (∃c, refl_trans_gen r a c ∧ r c b) :=
201
+ lemma cases_tail : refl_trans_gen r a b → b = a ∨ (∃ c, refl_trans_gen r a c ∧ r c b) :=
173
202
(cases_tail_iff r a b).1
174
203
175
204
@[elab_as_eliminator]
176
205
lemma head_induction_on
177
- {P : ∀(a:α), refl_trans_gen r a b → Prop }
206
+ {P : ∀ (a:α), refl_trans_gen r a b → Prop }
178
207
{a : α} (h : refl_trans_gen r a b)
179
208
(refl : P b refl)
180
- (head : ∀{a c} (h' : r a c) (h : refl_trans_gen r c b), P c h → P a (h.head h')) :
209
+ (head : ∀ {a c} (h' : r a c) (h : refl_trans_gen r c b), P c h → P a (h.head h')) :
181
210
P a h :=
182
211
begin
183
212
induction h generalizing P,
184
213
case refl_trans_gen.refl { exact refl },
185
214
case refl_trans_gen.tail : b c hab hbc ih {
186
215
apply ih,
187
216
show P b _, from head hbc _ refl,
188
- show ∀a a', r a a' → refl_trans_gen r a' b → P a' _ → P a _,
189
- from assume a a' hab hbc, head hab _ }
217
+ show ∀ a a', r a a' → refl_trans_gen r a' b → P a' _ → P a _,
218
+ from λ a a' hab hbc, head hab _ }
190
219
end
191
220
192
221
@[elab_as_eliminator]
193
222
lemma trans_induction_on
194
- {P : ∀{a b : α}, refl_trans_gen r a b → Prop }
223
+ {P : ∀ {a b : α}, refl_trans_gen r a b → Prop }
195
224
{a b : α} (h : refl_trans_gen r a b)
196
- (ih₁ : ∀a, @P a a refl)
197
- (ih₂ : ∀{a b} (h : r a b), P (single h))
198
- (ih₃ : ∀{a b c} (h₁ : refl_trans_gen r a b) (h₂ : refl_trans_gen r b c),
225
+ (ih₁ : ∀ a, @P a a refl)
226
+ (ih₂ : ∀ {a b} (h : r a b), P (single h))
227
+ (ih₃ : ∀ {a b c} (h₁ : refl_trans_gen r a b) (h₂ : refl_trans_gen r b c),
199
228
P h₁ → P h₂ → P (h₁.trans h₂)) :
200
229
P h :=
201
230
begin
@@ -204,21 +233,19 @@ begin
204
233
case refl_trans_gen.tail : b c hab hbc ih { exact ih₃ hab (single hbc) ih (ih₂ hbc) }
205
234
end
206
235
207
- lemma cases_head (h : refl_trans_gen r a b) : a = b ∨ (∃c, r a c ∧ refl_trans_gen r c b) :=
236
+ lemma cases_head (h : refl_trans_gen r a b) : a = b ∨ (∃ c, r a c ∧ refl_trans_gen r c b) :=
208
237
begin
209
238
induction h using relation.refl_trans_gen.head_induction_on,
210
239
{ left, refl },
211
240
{ right, existsi _, split; assumption }
212
241
end
213
242
214
- lemma cases_head_iff : refl_trans_gen r a b ↔ a = b ∨ (∃c, r a c ∧ refl_trans_gen r c b) :=
243
+ lemma cases_head_iff : refl_trans_gen r a b ↔ a = b ∨ (∃ c, r a c ∧ refl_trans_gen r c b) :=
215
244
begin
216
- split,
217
- { exact cases_head },
218
- { assume h,
219
- rcases h with rfl | ⟨c, hac, hcb⟩,
220
- { refl },
221
- { exact head hac hcb } }
245
+ use cases_head,
246
+ rintro (rfl | ⟨c, hac, hcb⟩),
247
+ { refl },
248
+ { exact head hac hcb }
222
249
end
223
250
224
251
lemma total_of_right_unique (U : relator.right_unique r)
@@ -303,14 +330,14 @@ end,
303
330
trans_gen.single⟩
304
331
305
332
lemma transitive_trans_gen : transitive (trans_gen r) :=
306
- assume a b c, trans
333
+ λ a b c, trans
307
334
308
335
lemma trans_gen_idem :
309
336
trans_gen (trans_gen r) = trans_gen r :=
310
337
trans_gen_eq_self transitive_trans_gen
311
338
312
339
lemma trans_gen_lift {p : β → β → Prop } {a b : α} (f : α → β)
313
- (h : ∀a b, r a b → p (f a) (f b)) (hab : trans_gen r a b) : trans_gen p (f a) (f b) :=
340
+ (h : ∀ a b, r a b → p (f a) (f b)) (hab : trans_gen r a b) : trans_gen p (f a) (f b) :=
314
341
begin
315
342
induction hab,
316
343
case trans_gen.single : c hac { exact trans_gen.single (h a c hac) },
@@ -331,7 +358,7 @@ end trans_gen
331
358
section refl_trans_gen
332
359
open refl_trans_gen
333
360
334
- lemma refl_trans_gen_iff_eq (h : ∀b, ¬ r a b) : refl_trans_gen r a b ↔ b = a :=
361
+ lemma refl_trans_gen_iff_eq (h : ∀ b, ¬ r a b) : refl_trans_gen r a b ↔ b = a :=
335
362
by rw [cases_head_iff]; simp [h, eq_comm]
336
363
337
364
lemma refl_trans_gen_iff_eq_or_trans_gen :
@@ -345,12 +372,12 @@ begin
345
372
end
346
373
347
374
lemma refl_trans_gen_lift {p : β → β → Prop } {a b : α} (f : α → β)
348
- (h : ∀a b, r a b → p (f a) (f b)) (hab : refl_trans_gen r a b) : refl_trans_gen p (f a) (f b) :=
349
- refl_trans_gen.trans_induction_on hab (assume a, refl)
350
- (assume a b, refl_trans_gen.single ∘ h _ _) (assume a b c _ _, trans)
375
+ (h : ∀ a b, r a b → p (f a) (f b)) (hab : refl_trans_gen r a b) : refl_trans_gen p (f a) (f b) :=
376
+ refl_trans_gen.trans_induction_on hab (λ a, refl)
377
+ (λ a b, refl_trans_gen.single ∘ h _ _) (λ a b c _ _, trans)
351
378
352
379
lemma refl_trans_gen_mono {p : α → α → Prop } :
353
- (∀a b, r a b → p a b) → refl_trans_gen r a b → refl_trans_gen p a b :=
380
+ (∀ a b, r a b → p a b) → refl_trans_gen r a b → refl_trans_gen p a b :=
354
381
refl_trans_gen_lift id
355
382
356
383
lemma refl_trans_gen_eq_self (refl : reflexive r) (trans : transitive r) :
@@ -362,17 +389,17 @@ funext $ λ a, funext $ λ b, propext $
362
389
end , single⟩
363
390
364
391
lemma reflexive_refl_trans_gen : reflexive (refl_trans_gen r) :=
365
- assume a, refl
392
+ λ a, refl
366
393
367
394
lemma transitive_refl_trans_gen : transitive (refl_trans_gen r) :=
368
- assume a b c, trans
395
+ λ a b c, trans
369
396
370
397
lemma refl_trans_gen_idem :
371
398
refl_trans_gen (refl_trans_gen r) = refl_trans_gen r :=
372
399
refl_trans_gen_eq_self reflexive_refl_trans_gen transitive_refl_trans_gen
373
400
374
401
lemma refl_trans_gen_lift' {p : β → β → Prop } {a b : α} (f : α → β)
375
- (h : ∀a b, r a b → refl_trans_gen p (f a) (f b))
402
+ (h : ∀ a b, r a b → refl_trans_gen p (f a) (f b))
376
403
(hab : refl_trans_gen r a b) : refl_trans_gen p (f a) (f b) :=
377
404
by simpa [refl_trans_gen_idem] using refl_trans_gen_lift f h hab
378
405
@@ -390,21 +417,22 @@ in a term rewriting system, then *confluence* is the property that if
390
417
`a` rewrites to both `b` and `c`, then `join r` relates `b` and `c`
391
418
(see `relation.church_rosser`).
392
419
-/
393
- def join (r : α → α → Prop ) : α → α → Prop := λa b, ∃c, r a c ∧ r b c
420
+ def join (r : α → α → Prop ) : α → α → Prop := λ a b, ∃ c, r a c ∧ r b c
394
421
395
422
section join
396
423
open refl_trans_gen refl_gen
397
424
425
+ /-- A sufficient condition for the Church-Rosser property. -/
398
426
lemma church_rosser
399
- (h : ∀a b c, r a b → r a c → ∃d, refl_gen r b d ∧ refl_trans_gen r c d)
427
+ (h : ∀ a b c, r a b → r a c → ∃ d, refl_gen r b d ∧ refl_trans_gen r c d)
400
428
(hab : refl_trans_gen r a b) (hac : refl_trans_gen r a c) : join (refl_trans_gen r) b c :=
401
429
begin
402
430
induction hab,
403
431
case refl_trans_gen.refl { exact ⟨c, hac, refl⟩ },
404
432
case refl_trans_gen.tail : d e had hde ih {
405
433
clear hac had a,
406
434
rcases ih with ⟨b, hdb, hcb⟩,
407
- have : ∃a, refl_trans_gen r e a ∧ refl_gen r b a,
435
+ have : ∃ a, refl_trans_gen r e a ∧ refl_gen r b a,
408
436
{ clear hcb, induction hdb,
409
437
case refl_trans_gen.refl { exact ⟨e, refl, refl_gen.single hde⟩ },
410
438
case refl_trans_gen.tail : f b hdf hfb ih {
@@ -422,33 +450,33 @@ lemma join_of_single (h : reflexive r) (hab : r a b) : join r a b :=
422
450
⟨b, hab, h b⟩
423
451
424
452
lemma symmetric_join : symmetric (join r) :=
425
- assume a b ⟨c, hac, hcb⟩, ⟨c, hcb, hac⟩
453
+ λ a b ⟨c, hac, hcb⟩, ⟨c, hcb, hac⟩
426
454
427
455
lemma reflexive_join (h : reflexive r) : reflexive (join r) :=
428
- assume a, ⟨a, h a, h a⟩
456
+ λ a, ⟨a, h a, h a⟩
429
457
430
- lemma transitive_join (ht : transitive r) (h : ∀a b c, r a b → r a c → join r b c) :
458
+ lemma transitive_join (ht : transitive r) (h : ∀ a b c, r a b → r a c → join r b c) :
431
459
transitive (join r) :=
432
- assume a b c ⟨x, hax, hbx⟩ ⟨y, hby, hcy⟩,
460
+ λ a b c ⟨x, hax, hbx⟩ ⟨y, hby, hcy⟩,
433
461
let ⟨z, hxz, hyz⟩ := h b x y hbx hby in
434
462
⟨z, ht hax hxz, ht hcy hyz⟩
435
463
436
464
lemma equivalence_join (hr : reflexive r) (ht : transitive r)
437
- (h : ∀a b c, r a b → r a c → join r b c) :
465
+ (h : ∀ a b c, r a b → r a c → join r b c) :
438
466
equivalence (join r) :=
439
467
⟨reflexive_join hr, symmetric_join, transitive_join ht h⟩
440
468
441
469
lemma equivalence_join_refl_trans_gen
442
- (h : ∀a b c, r a b → r a c → ∃d, refl_gen r b d ∧ refl_trans_gen r c d) :
470
+ (h : ∀ a b c, r a b → r a c → ∃ d, refl_gen r b d ∧ refl_trans_gen r c d) :
443
471
equivalence (join (refl_trans_gen r)) :=
444
- equivalence_join reflexive_refl_trans_gen transitive_refl_trans_gen (assume a b c, church_rosser h)
472
+ equivalence_join reflexive_refl_trans_gen transitive_refl_trans_gen (λ a b c, church_rosser h)
445
473
446
474
lemma join_of_equivalence {r' : α → α → Prop } (hr : equivalence r)
447
- (h : ∀a b, r' a b → r a b) : join r' a b → r a b
475
+ (h : ∀ a b, r' a b → r a b) : join r' a b → r a b
448
476
| ⟨c, hac, hbc⟩ := hr.2 .2 (h _ _ hac) (hr.2 .1 $ h _ _ hbc)
449
477
450
478
lemma refl_trans_gen_of_transitive_reflexive {r' : α → α → Prop } (hr : reflexive r)
451
- (ht : transitive r) (h : ∀a b, r' a b → r a b) (h' : refl_trans_gen r' a b) :
479
+ (ht : transitive r) (h : ∀ a b, r' a b → r a b) (h' : refl_trans_gen r' a b) :
452
480
r a b :=
453
481
begin
454
482
induction h' with b c hab hbc ih,
@@ -457,7 +485,7 @@ begin
457
485
end
458
486
459
487
lemma refl_trans_gen_of_equivalence {r' : α → α → Prop } (hr : equivalence r) :
460
- (∀a b, r' a b → r a b) → refl_trans_gen r' a b → r a b :=
488
+ (∀ a b, r' a b → r a b) → refl_trans_gen r' a b → r a b :=
461
489
refl_trans_gen_of_transitive_reflexive hr.1 hr.2 .2
462
490
463
491
end join
@@ -467,7 +495,7 @@ section eqv_gen
467
495
lemma eqv_gen_iff_of_equivalence (h : equivalence r) : eqv_gen r a b ↔ r a b :=
468
496
iff.intro
469
497
begin
470
- assume h,
498
+ intro h,
471
499
induction h,
472
500
case eqv_gen.rel { assumption },
473
501
case eqv_gen.refl { exact h.1 _ },
@@ -477,7 +505,7 @@ iff.intro
477
505
(eqv_gen.rel a b)
478
506
479
507
lemma eqv_gen_mono {r p : α → α → Prop }
480
- (hrp : ∀a b, r a b → p a b) (h : eqv_gen r a b) : eqv_gen p a b :=
508
+ (hrp : ∀ a b, r a b → p a b) (h : eqv_gen r a b) : eqv_gen p a b :=
481
509
begin
482
510
induction h,
483
511
case eqv_gen.rel : a b h { exact eqv_gen.rel _ _ (hrp _ _ h) },
0 commit comments