Skip to content

Commit 2d98791

Browse files
authored
Update QL2.lean
1 parent 5d35a21 commit 2d98791

File tree

1 file changed

+45
-7
lines changed

1 file changed

+45
-7
lines changed

Fad/Assignment02.lean

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,57 @@ def sum : List Nat → Nat :=
4949
5050
Try to give meaningful names to your theorems. Use `sorry` as the proof. -/
5151

52-
example : sum (snoc ms n) = n + sum ms := by
52+
theorem sum_snoc (ms : List Nat) (n : Nat) :
53+
sum (snoc ms n) = n + sum ms := by
5354
unfold sum
5455
induction ms with
5556
| nil =>
56-
simp [snoc]
57+
simp [snoc, sum]
5758
| cons m ms ih =>
58-
simp [snoc, ih]
59-
exact Nat.add_left_comm m n (List.foldr (fun n acc => n + acc) 0 ms)
60-
done
59+
simp[snoc, ih]
60+
rw [<- Nat.add_assoc, Nat.add_comm m n, Nat.add_assoc]
61+
62+
-- sum (ms ++ ns) = sum ms + sum ns --
63+
64+
theorem foldr_append (f : α → β → β) (e : β) (xs ys : List α) :
65+
List.foldr f e (xs ++ ys) = List.foldr f (List.foldr f e ys) xs := by
66+
induction xs with
67+
| nil => simp [List.foldr]
68+
| cons x xs hd => simp [List.foldr]
69+
70+
theorem sum_append (ms ns : List Nat) :
71+
sum (ms ++ ns) = sum ms + sum ns := by
72+
unfold sum
73+
induction ms with
74+
| nil =>
75+
simp [sum, List.foldr]
76+
| cons m ms ih =>
77+
simp[sum]
78+
rw [<- foldr_append, ih, Nat.add_assoc]
79+
80+
-- sum (reverse ns) = sum ns --
81+
82+
theorem snoc_eq_append (xs : List Nat) (x : Nat) :
83+
snoc xs x = xs ++ [x] := by
84+
induction xs with
85+
| nil => simp [snoc]
86+
| cons y ys ih =>
87+
simp [snoc]
88+
exact ih
89+
90+
theorem sum_cons (n : Nat) (ns : List Nat) :
91+
sum (n :: ns) = n + sum ns := by
92+
unfold sum
93+
simp [List.foldr]
6194

62-
example : sum (ms ++ ns) = sum ms + sum ns := sorry
95+
theorem sum_reverse (ns : List Nat) :
96+
sum (ns.reverse) = sum ns := by
97+
induction ns with
98+
| nil => simp [sum]
99+
| cons n ns ih =>
100+
rw [List.reverse_cons]
101+
rw [<- snoc_eq_append, sum_snoc, sum_cons, ih]
63102

64-
example : sum ns.reverse = sum ns := sorry
65103

66104
/- ## Question L.3
67105

0 commit comments

Comments
 (0)