- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinductive.lean
More file actions
Latest commit
73 lines (50 loc) · 3.24 KB
/
Copy pathinductive.lean
File metadata and controls
73 lines (50 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
namespace hidden
universes u₁ u₂ u₃
deflist' (α : Type u₁) (β : Type u₂) : Type (max u₁ u₂ (u₃+1)) := Π (γ : Type u₃), γ → (α → β → γ) → γ
deflist'.nil {α β} : list' α β := λ _ x _, x
deflist'.cons {α β} : α → β → list' α β := λ x y _ _ f, f x y
deflist'.map {α β γ} : (β → γ) → list' α β → list' α γ := λ f l _ x g, l _ x (λ y z, g y (f z))
deflist (α) : Type (max u₁ (u₂+1) (u₃+1)) := Π β, (list'.{u₁ u₂ u₃} α β → β) → β
deflist.fold {α} : list' α (list α) → list α := λ l _ f, f (l.map (λ l, l _ f))
deflist.rec {α β} : (list' α β → β) → list α → β := λ f l, l _ f
deflist.unfold {α} : list α → list' α (list α) := list.rec (list'.map list.fold)
--def list.unfold' {α} : list α → list' α (list α) := λ (l : list α), l (list' α (list α)) (λ (l : list' α (list' α (list α))) (_x) (x : _x) (g : α → list α → _x), l _x x (λ (y : α) (z : list' α (list α)), g y (λ (_x) (f : list' α _x → _x), f (λ (_y) (x : _y) (g : α → _x → _y), z _y x (λ (y : α) (z : list α), g y (z _x f))))))
deflist.unfold' {α : Type u₁} : list.{u₁ u₂ u₃} α → list'.{u₁ (max u₁ (u₂+1) (u₃+1)) u₃} α (list.{u₁ u₂ u₃} α) := λ (l : list.{u₁ u₂ u₃} α), l (list'.{u₁ (max u₁ (u₂+1) (u₃+1)) u₃} α (list.{u₁ u₂ u₃} α)) (λ l _ x f, l _ x (λ x l, f x (λ _ f, f (λ _ x g, l _ x (λ x l, g x (l _ f))))))
set_option pp.all true
set_option pp.full_names false
#check @list.fold
#check @list.unfold
#check @list.unfold'
#print list.unfold
deflist.nil {α} : list α := list.fold list'.nil
deflist.cons {α} : α → list α → list α := λ x l, list.fold (list'.cons x l)
deflist.length {α} : list α → ℕ := list.rec (λ l, l _ 0 (λ _ x, x + 1))
#reduce list.nil.length
#reduce (list.cons 2 list.nil).length
#reduce (list.cons 3 (list.cons 2 list.nil)).length
deflist.head {α} : list α → option α := λ l, l.unfold _ none (λ x _, some x)
#reduce list.nil.head
#reduce (list.cons 2 list.nil).head
#reduce (list.cons 3 (list.cons 2 list.nil)).head
deflist.tail {α} : list α → list α := λ l, l.unfold _ list.nil (λ _ l, l)
#reduce list.nil.tail.length
#reduce (list.cons 2 list.nil).tail.length
#reduce (list.cons 3 (list.cons 2 list.nil)).tail.length
#reduce list.nil.tail.head
#reduce (list.cons 2 list.nil).tail.head
#reduce (list.cons 3 (list.cons 2 list.nil)).tail.head
end hidden
namespace hidden₂
universes u₁ u₂ u₃
variables {α : Type u₁} {β : Type u₂} {γ : Type u₃}
defprod (α : Type u₁) (β : Type u₂) : Type (max u₁ u₂ (u₃+1)) := Π (γ : Type u₃), (α → β → γ) → γ
defprod.mk (x : α) (y : β) : prod α β := λ γ f, f x y
defprod.fst (z : prod α β) : α := z α (λ x y, x)
defprod.snd (z : prod α β) : β := z β (λ x y, y)
defsum (α : Type u₁) (β : Type u₂) : Type (max u₁ u₂ (u₃+1)) := Π (γ : Type u₃), (α → γ) → (β → γ) → γ
defsum.inl (x : α) : sum α β := λ γ f g, f x
defsum.inr (y : β) : sum α β := λ γ f g, g y
defsum.cases_on (z : sum α β) (f : α → γ) (g : β → γ) : γ := z γ f g
defempty := Π (α : Type*), α
defunit := Π (α : Type*), α → α
end hidden₂