@@ -49,19 +49,57 @@ def sum : List Nat → Nat :=
4949
5050Try 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