2014-10-13 14:08:29 +00:00
|
|
|
|
import logic data.prod
|
|
|
|
|
open eq.ops prod
|
2014-10-08 19:57:00 +00:00
|
|
|
|
|
|
|
|
|
inductive tree (A : Type) :=
|
2015-02-26 01:00:10 +00:00
|
|
|
|
| leaf : A → tree A
|
|
|
|
|
| node : tree A → tree A → tree A
|
2014-10-08 19:57:00 +00:00
|
|
|
|
|
2014-10-13 14:08:29 +00:00
|
|
|
|
inductive one.{l} : Type.{max 1 l} :=
|
|
|
|
|
star : one
|
|
|
|
|
|
|
|
|
|
set_option pp.universes true
|
|
|
|
|
|
2014-10-08 19:57:00 +00:00
|
|
|
|
namespace tree
|
2014-11-13 00:38:46 +00:00
|
|
|
|
namespace manual
|
2014-10-13 14:08:29 +00:00
|
|
|
|
section
|
|
|
|
|
universe variables l₁ l₂
|
|
|
|
|
variable {A : Type.{l₁}}
|
|
|
|
|
variable (C : tree A → Type.{l₂})
|
|
|
|
|
definition below (t : tree A) : Type :=
|
2015-02-11 20:49:27 +00:00
|
|
|
|
tree.rec_on t (λ a, one.{l₂}) (λ t₁ t₂ r₁ r₂, C t₁ × C t₂ × r₁ × r₂)
|
2014-10-13 14:08:29 +00:00
|
|
|
|
end
|
2014-10-08 19:57:00 +00:00
|
|
|
|
|
2014-10-13 14:08:29 +00:00
|
|
|
|
section
|
|
|
|
|
universe variables l₁ l₂
|
|
|
|
|
variable {A : Type.{l₁}}
|
|
|
|
|
variable {C : tree A → Type.{l₂}}
|
|
|
|
|
definition below_rec_on (t : tree A) (H : Π (n : tree A), below C n → C n) : C t
|
|
|
|
|
:= have general : C t × below C t, from
|
2015-02-11 20:49:27 +00:00
|
|
|
|
tree.rec_on t
|
2014-10-13 14:08:29 +00:00
|
|
|
|
(λa, (H (leaf a) one.star, one.star))
|
|
|
|
|
(λ (l r : tree A) (Hl : C l × below C l) (Hr : C r × below C r),
|
|
|
|
|
have b : below C (node l r), from
|
|
|
|
|
(pr₁ Hl, pr₁ Hr, pr₂ Hl, pr₂ Hr),
|
|
|
|
|
have c : C (node l r), from
|
|
|
|
|
H (node l r) b,
|
|
|
|
|
(c, b)),
|
|
|
|
|
pr₁ general
|
|
|
|
|
end
|
2014-11-13 00:38:46 +00:00
|
|
|
|
end manual
|
|
|
|
|
section
|
|
|
|
|
universe variables l₁ l₂
|
|
|
|
|
variable {A : Type.{l₁}}
|
|
|
|
|
variable {C : tree A → Type.{l₂+1}}
|
2015-02-11 20:49:27 +00:00
|
|
|
|
definition below_rec_on (t : tree A) (H : Π (n : tree A), @tree.below A C n → C n) : C t
|
|
|
|
|
:= have general : C t × @tree.below A C t, from
|
|
|
|
|
tree.rec_on t
|
2015-06-24 21:59:17 +00:00
|
|
|
|
(λa, (H (leaf a) poly_unit.star, poly_unit.star))
|
2015-02-11 20:49:27 +00:00
|
|
|
|
(λ (l r : tree A) (Hl : C l × @tree.below A C l) (Hr : C r × @tree.below A C r),
|
|
|
|
|
have b : @tree.below A C (node l r), from
|
2014-11-13 00:38:46 +00:00
|
|
|
|
((pr₁ Hl, pr₂ Hl), (pr₁ Hr, pr₂ Hr)),
|
|
|
|
|
have c : C (node l r), from
|
|
|
|
|
H (node l r) b,
|
|
|
|
|
(c, b)),
|
|
|
|
|
pr₁ general
|
|
|
|
|
end
|
2014-10-08 19:57:00 +00:00
|
|
|
|
|
|
|
|
|
set_option pp.universes true
|
|
|
|
|
|
|
|
|
|
theorem leaf_ne_tree {A : Type} (a : A) (l r : tree A) : leaf a ≠ node l r :=
|
|
|
|
|
assume h : leaf a = node l r,
|
2015-02-11 20:49:27 +00:00
|
|
|
|
tree.no_confusion h
|
2014-10-08 19:57:00 +00:00
|
|
|
|
end tree
|