368 lines
20 KiB
JSON
368 lines
20 KiB
JSON
|
[
|
|||
|
{
|
|||
|
"nl_problem": "For any natural number n, n + 0 = n.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural number n. We want to show n + 0 = n. ",
|
|||
|
"By using fats of addition on both sides, LHS and RHS are now equal, done."
|
|||
|
],
|
|||
|
"fl_problem": "theorem n_plus_zero : ∀ n : ℕ, n + 0 = n := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + 0 = n.\n",
|
|||
|
"theorem n_plus_zero : ∀ n : ℕ, n + 0 = n := by\n",
|
|||
|
" -- Consider some n in Nats.\n",
|
|||
|
" intro n",
|
|||
|
"-- Using facts of addition simplify n + 0 to n.\n",
|
|||
|
" rw [Nat.add_zero]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
],
|
|||
|
|
|||
|
"nl_problem_proved_sketch": "For any natural number n, n + 0 = n.",
|
|||
|
"nl_solution_proved_sketch": [
|
|||
|
"We want to show n + 0 = n. ",
|
|||
|
"We have the fact of addition that, n + 0 = n. ",
|
|||
|
"Thus, the left-hand side and right-hand side are equal, which completes the proof."
|
|||
|
],
|
|||
|
"fl_problem_proved_sketch": "theorem n_plus_zero_proved_formal_sketch : ∀ n : ℕ, n + 0 = n := by",
|
|||
|
"fl_solution_proved_sketch": [
|
|||
|
"-- Prove that n + 0 = n via a formal proof sketch",
|
|||
|
"theorem n_plus_zero_proved_formal_sketch : ∀ n : ℕ, n + 0 = n := by",
|
|||
|
" -- We have the fact of addition n + 0 = n, use it to show left and right are equal.",
|
|||
|
" have h_nat_add_zero: ∀ n : ℕ, n + 0 = n := Nat.add_zero",
|
|||
|
" exact h_nat_add_zero"
|
|||
|
],
|
|||
|
"src_header_fl_solution_proved_sketch": ["import Mathlib.Data.Nat.Basic"],
|
|||
|
|
|||
|
"nl_problem_proved_sketch_aesop": "For any natural number n, n + 0 = n.",
|
|||
|
"nl_solution_proved_sketch_aesop": [
|
|||
|
"We want to show n + 0 = n. ",
|
|||
|
"We have the fact of addition that, n + 0 = n. ",
|
|||
|
"Thus, the left-hand side and right-hand side are equal, which completes the proof."
|
|||
|
],
|
|||
|
"fl_problem_proved_sketch_aesop": "theorem n_plus_zero_proved_formal_sketch' : ∀ n : ℕ, n + 0 = n := by",
|
|||
|
"fl_solution_proved_sketch_aesop": [
|
|||
|
"-- Prove that n + 0 = n via a formal proof sketch with aesop. ",
|
|||
|
"theorem n_plus_zero_proved_formal_sketch' : ∀ n : ℕ, n + 0 = n := by",
|
|||
|
" -- We have the fact of addition n + 0 = n, use it to show left and right are equal. ",
|
|||
|
" have h_nat_add_zero: ∀ n : ℕ, n + 0 = n := by aesop",
|
|||
|
" exact h_nat_add_zero"
|
|||
|
],
|
|||
|
"src_header_fl_solution_proved_sketch_aesop": [
|
|||
|
"import Mathlib.Data.Nat.Basic",
|
|||
|
"import Aesop"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "For any natural number n, 0 + n = n.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural number n. We want to show 0 + n = n.",
|
|||
|
"By using facts of addition and induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem zero_plus_n : ∀ n : ℕ, 0 + n = n := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that 0 + n = n by induction",
|
|||
|
"theorem zero_plus_n : ∀ n : ℕ, 0 + n = n := by",
|
|||
|
"-- Consider some n in Nats.",
|
|||
|
"intro n",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: 0 + 0 = 0",
|
|||
|
"rw [Nat.add_zero]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: assume 0 + n = n, prove 0 + succ n = succ n",
|
|||
|
"rw [Nat.add_succ]",
|
|||
|
"rw [ih]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
],
|
|||
|
|
|||
|
"nl_problem_proved_sketch": "For any natural number n, 0 + n = n.",
|
|||
|
"nl_solution_proved_sketch": [
|
|||
|
"We want to show 0 + n = n.",
|
|||
|
"By using the fact of addition and performing induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem_proved_sketch": "theorem zero_plus_n_proved_formal_sketch : ∀ n : ℕ, 0 + n = n := by",
|
|||
|
"fl_solution_proved_sketch": [
|
|||
|
"-- Prove that 0 + n = n by induction via a formal proof sketch",
|
|||
|
"theorem zero_plus_n_proved_formal_sketch : ∀ n : ℕ, 0 + n = n := by",
|
|||
|
"-- Consider some n in Nats.",
|
|||
|
"intro n",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: 0 + 0 = 0",
|
|||
|
"have h_base: 0 + 0 = 0 := by rw [Nat.add_zero]",
|
|||
|
"exact h_base",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: assume 0 + n = n, prove 0 + succ n = succ n",
|
|||
|
"have h_inductive: 0 + Nat.succ n = Nat.succ n := by",
|
|||
|
"rw [Nat.add_succ]",
|
|||
|
"rw [ih]",
|
|||
|
"exact h_inductive"
|
|||
|
],
|
|||
|
"src_header_fl_solution_proved_sketch": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
],
|
|||
|
|
|||
|
"nl_problem_proved_sketch_aesop": "For any natural number n, 0 + n = n.",
|
|||
|
"nl_solution_proved_sketch_aesop": [
|
|||
|
"We want to show 0 + n = n.",
|
|||
|
"By using the fact of addition and performing induction on n, we can prove the statement for both the base case and the inductive step using aesop."
|
|||
|
],
|
|||
|
|
|||
|
"fl_problem_proved_sketch_aesop": "theorem zero_plus_n_proved_formal_sketch' : ∀ n : ℕ, 0 + n = n := by",
|
|||
|
"fl_solution_proved_sketch_aesop": [
|
|||
|
"-- Prove that 0 + n = n by induction via a formal proof sketch with aesop.",
|
|||
|
"theorem zero_plus_n_proved_formal_sketch' : ∀ n : ℕ, 0 + n = n := by",
|
|||
|
"-- Consider some n in Nats.",
|
|||
|
"intro n",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: 0 + 0 = 0",
|
|||
|
"have h_base: 0 + 0 = 0 := by aesop",
|
|||
|
"exact h_base",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: assume 0 + n = n, prove 0 + succ n = succ n",
|
|||
|
"have h_inductive: 0 + Nat.succ n = Nat.succ n := by aesop",
|
|||
|
"exact h_inductive"
|
|||
|
],
|
|||
|
"src_header_fl_solution_proved_sketch_aesop": [
|
|||
|
"import Mathlib.Data.Nat.Basic",
|
|||
|
"import Aesop"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "For any natural numbers n and m we have commutativity, n + m = m + n.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural numbers n and m. We want to show n + m = m + n.",
|
|||
|
"By using facts of addition and induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem add_comm_normal : ∀ n m : ℕ, n + m = m + n := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + m = m + n",
|
|||
|
"theorem add_comm_normal : ∀ n m : ℕ, n + m = m + n := by",
|
|||
|
"-- Consider some n and m in Nats.",
|
|||
|
"intros n m",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: When n = 0, we need to show 0 + m = m + 0.",
|
|||
|
"-- Using the definition of addition, 0 + m = m and m + 0 = m.",
|
|||
|
"rw [Nat.zero_add, Nat.add_zero]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: Assume n + m = m + n, we need to show succ n + m = m + succ n.",
|
|||
|
"-- We use the fact n + (m + 1) = (n + m) + 1.",
|
|||
|
"have plus_n_Sm_normal: ∀ n m : ℕ, n + (m + 1) = (n + m) + 1 := by",
|
|||
|
" intros n m",
|
|||
|
" rw [Nat.add_succ]",
|
|||
|
"-- Apply the fact to rewrite succ n + m = (n + m) + 1.",
|
|||
|
"rw [Nat.add_succ, Nat.add_zero]",
|
|||
|
"rw [← ih]",
|
|||
|
"rw [Nat.succ_add]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "For any natural numbers n and m, n + m = m + n.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural numbers n and m. We want to show n + m = m + n.",
|
|||
|
"By using the fact of addition and performing induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem add_comm_proved_formal_sketch : ∀ n m : ℕ, n + m = m + n := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + m = m + n via a formal proof sketch",
|
|||
|
"theorem add_comm_proved_formal_sketch : ∀ n m : ℕ, n + m = m + n := by",
|
|||
|
"-- Consider some n and m in Nats.",
|
|||
|
"intros n m",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: When n = 0, we need to show 0 + m = m + 0.",
|
|||
|
"-- We have the fact 0 + m = m by the definition of addition.",
|
|||
|
"have h_base: 0 + m = m := Nat.zero_add m",
|
|||
|
"-- We also have the fact m + 0 = m by the definition of addition.",
|
|||
|
"have h_symm: m + 0 = m := Nat.add_zero m",
|
|||
|
"-- Combining these, we get 0 + m = m + 0.",
|
|||
|
"rw [h_base, h_symm]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: Assume n + m = m + n, we need to show succ n + m = m + succ n.",
|
|||
|
"-- By the inductive hypothesis, we have n + m = m + n.",
|
|||
|
"have h_inductive: n + m = m + n := ih",
|
|||
|
"-- proof is:",
|
|||
|
"-- We eventually want to flip n + m and simplify to make both sides the same. Thus,",
|
|||
|
"-- 1. Note we start with: Nat.succ n + m = m + Nat.succ n, so, pull the succ out from m + Nat.succ n on the right side from the addition using addition facts Nat.add_succ.",
|
|||
|
"have h_pull_succ_out_from_right: m + Nat.succ n = Nat.succ (m + n) := by rw [Nat.add_succ]",
|
|||
|
"-- 2. then to flip m + S n to something like S (n + m) we need to use the IH.",
|
|||
|
"have h_flip_n_plus_m: Nat.succ (n + m) = Nat.succ (m + n) := by rw [h_inductive]",
|
|||
|
"-- 3. Now the n & m are on the correct sides Nat.succ n + m = Nat.succ (n + m), so let's use the def of addition to pull out the succ from the addition on the left using Nat.succ_add.",
|
|||
|
"have h_pull_succ_out_from_left: Nat.succ n + m = Nat.succ (n + m) := by rw [Nat.succ_add]",
|
|||
|
"-- Combining these, we get succ n + m = m + succ n.",
|
|||
|
"rw [h_pull_succ_out_from_right, ←h_flip_n_plus_m, h_pull_succ_out_from_left]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "For any natural numbers n and m, n + m = m + n.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural numbers n and m. We want to show n + m = m + n.",
|
|||
|
"By using the fact of addition and performing induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem add_comm_proved_formal_sketch_aesop : ∀ n m : ℕ, n + m = m + n := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + m = m + n via a formal proof sketch with aesop.",
|
|||
|
"theorem add_comm_proved_formal_sketch_aesop : ∀ n m : ℕ, n + m = m + n := by",
|
|||
|
"-- Consider some n and m in Nats.",
|
|||
|
"intros n m",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: When n = 0, we need to show 0 + m = m + 0.",
|
|||
|
"-- We have the fact 0 + m = m by the definition of addition.",
|
|||
|
"have h_base: 0 + m = m := by aesop",
|
|||
|
"-- We also have the fact m + 0 = m by the definition of addition.",
|
|||
|
"have h_symm: m + 0 = m := by aesop",
|
|||
|
"-- Combining these, we get 0 + m = m + 0.",
|
|||
|
"rw [h_base, h_symm]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: Assume n + m = m + n, we need to show succ n + m = m + succ n.",
|
|||
|
"-- By the inductive hypothesis, we have n + m = m + n.",
|
|||
|
"have h_inductive: n + m = m + n := by aesop",
|
|||
|
"-- proof is:",
|
|||
|
"-- We eventually want to flip n + m and simplify to make both sides the same. Thus,",
|
|||
|
"-- 1. Note we start with: Nat.succ n + m = m + Nat.succ n, so, pull the succ out from m + Nat.succ n on the right side from the addition using addition facts Nat.add_succ.",
|
|||
|
"have h_pull_succ_out_from_right: m + Nat.succ n = Nat.succ (m + n) := by aesop",
|
|||
|
"-- 2. then to flip m + S n to something like S (n + m) we need to use the IH.",
|
|||
|
"have h_flip_n_plus_m: Nat.succ (n + m) = Nat.succ (m + n) := by aesop",
|
|||
|
"-- 3. Now the n & m are on the correct sides Nat.succ n + m = Nat.succ (n + m), so let's use the def of addition to pull out the succ from the addition on the left using Nat.succ_add.",
|
|||
|
"have h_pull_succ_out_from_left: Nat.succ n + m = Nat.succ (n + m) := by rw [Nat.succ_add]",
|
|||
|
"-- Combining these, we get succ n + m = m + succ n.",
|
|||
|
"rw [h_pull_succ_out_from_right, ←h_flip_n_plus_m, h_pull_succ_out_from_left]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic",
|
|||
|
"import Aesop"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "Prove that for any natural numbers n, m, and p, n + (m + p) = (n + m) + p.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural numbers n, m, and p. We want to show n + (m + p) = (n + m) + p.",
|
|||
|
"By using facts of addition and induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem add_assoc_normal : ∀ n m p : ℕ, n + (m + p) = (n + m) + p := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + (m + p) = (n + m) + p",
|
|||
|
"theorem add_assoc_normal : ∀ n m p : ℕ, n + (m + p) = (n + m) + p := by",
|
|||
|
"-- Consider some n, m, and p in Nats.",
|
|||
|
"intros n m p",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: When n = 0, we need to show 0 + (m + p) = (0 + m) + p.",
|
|||
|
"-- Using the definition of addition, 0 + (m + p) = m + p and (0 + m) + p = m + p.",
|
|||
|
"rw [Nat.zero_add, Nat.zero_add]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: Assume n + (m + p) = (n + m) + p, we need to show succ n + (m + p) = (succ n + m) + p.",
|
|||
|
"-- proof strategy is, we move succ n out (or in) enough times then use the IH until both sides are the same.",
|
|||
|
"-- 1. let's start by pulling out the succ from the left side and have the entire addition inside the succ.",
|
|||
|
"rw [Nat.succ_add]",
|
|||
|
"-- 2. Now that we have the IH hypothesis appearing inside the left, let's apply it so we have n + (m + p) = (n + m) + p.",
|
|||
|
"rw [ih]",
|
|||
|
"-- 3. Now that the parentheses (apps of plus) are in the right place for both sides, push the succ on the left twice so both terms are the same.",
|
|||
|
"rw [← Nat.succ_add, ← Nat.succ_add]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "Prove that for any natural numbers n, m, and p, n + (m + p) = (n + m) + p.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural numbers n, m, and p. We want to show n + (m + p) = (n + m) + p.",
|
|||
|
"By using facts of addition and induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem add_assoc_proved_formal_sketch : ∀ n m p : ℕ, n + (m + p) = (n + m) + p := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + (m + p) = (n + m) + p",
|
|||
|
"theorem add_assoc_proved_formal_sketch : ∀ n m p : ℕ, n + (m + p) = (n + m) + p := by",
|
|||
|
"-- Consider some n, m, and p in Nats.",
|
|||
|
"intros n m p",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: When n = 0, we need to show 0 + (m + p) = (0 + m) + p.",
|
|||
|
"-- Using the definition of addition, 0 + (m + p) = m + p and (0 + m) + p = m + p.",
|
|||
|
"rw [Nat.zero_add, Nat.zero_add]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: Assume n + (m + p) = (n + m) + p, we need to show succ n + (m + p) = (succ n + m) + p.",
|
|||
|
"-- proof strategy is, we move succ n out (or in) enough times then use the IH until both sides are the same.",
|
|||
|
"-- 1. let's start by pulling out the succ from the left side and have the entire addition inside the succ.",
|
|||
|
"have h_pull_add_succ_out_from_left: Nat.succ n + (m + p) = Nat.succ (n + (m + p)) := by rw [Nat.succ_add]",
|
|||
|
"-- 2. Now that we have the IH hypothesis appearing inside the left, let's apply it so we have n + (m + p) = (n + m) + p.",
|
|||
|
"have h_inside_left_associates: Nat.succ (n + (m + p)) = Nat.succ ((n + m) + p) := by rw [ih]",
|
|||
|
"-- 3. Now that the parentheses (apps of plus) are in the right place for both sides, push the succ on the left twice so both terms are the same.",
|
|||
|
"have h_push_succ_in_left_twice: Nat.succ ((n + m) + p) = ((Nat.succ n) + m) + p := by rw [← Nat.succ_add, ← Nat.succ_add]",
|
|||
|
"-- Combining these, we get succ n + (m + p) = (succ n + m) + p.",
|
|||
|
"rw [h_pull_add_succ_out_from_left, h_inside_left_associates, h_push_succ_in_left_twice]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic"
|
|||
|
]
|
|||
|
},
|
|||
|
|
|||
|
{
|
|||
|
"nl_problem": "Prove that for any natural numbers n, m, and p, n + (m + p) = (n + m) + p.",
|
|||
|
"nl_solution": [
|
|||
|
"Consider some natural numbers n, m, and p. We want to show n + (m + p) = (n + m) + p.",
|
|||
|
"By using facts of addition and induction on n, we can prove the statement for both the base case and the inductive step."
|
|||
|
],
|
|||
|
"fl_problem": "theorem add_assoc_proved_formal_sketch_aesop : ∀ n m p : ℕ, n + (m + p) = (n + m) + p := by",
|
|||
|
"fl_solution": [
|
|||
|
"-- Prove that n + (m + p) = (n + m) + p via a formal proof sketch with aesop",
|
|||
|
"theorem add_assoc_proved_formal_sketch_aesop : ∀ n m p : ℕ, n + (m + p) = (n + m) + p := by",
|
|||
|
"-- Consider some n, m, and p in Nats.",
|
|||
|
"intros n m p",
|
|||
|
"-- Perform induction on n.",
|
|||
|
"induction n with",
|
|||
|
"| zero =>",
|
|||
|
"-- Base case: When n = 0, we need to show 0 + (m + p) = (0 + m) + p.",
|
|||
|
"-- Using the definition of addition, 0 + (m + p) = m + p and (0 + m) + p = m + p.",
|
|||
|
"rw [Nat.zero_add, Nat.zero_add]",
|
|||
|
"| succ n ih =>",
|
|||
|
"-- Inductive step: Assume n + (m + p) = (n + m) + p, we need to show succ n + (m + p) = (succ n + m) + p.",
|
|||
|
"-- proof strategy is, we move succ n out (or in) enough times then use the IH until both sides are the same.",
|
|||
|
"-- 1. let's start by pulling out the succ from the left side and have the entire addition inside the succ.",
|
|||
|
"have h_pull_add_succ_out_from_left: Nat.succ n + (m + p) = Nat.succ (n + (m + p)) := by rw [Nat.succ_add]",
|
|||
|
"-- 2. Now that we have the IH hypothesis appearing inside the left, let's apply it so we have n + (m + p) = (n + m) + p.",
|
|||
|
"have h_inside_left_associates: Nat.succ (n + (m + p)) = Nat.succ ((n + m) + p) := by aesop",
|
|||
|
"-- 3. Now that the parentheses (apps of plus) are in the right place for both sides, push the succ on the left twice so both terms are the same.",
|
|||
|
"have h_push_succ_in_left_twice: Nat.succ ((n + m) + p) = ((Nat.succ n) + m) + p := by rw [← Nat.succ_add, ← Nat.succ_add]",
|
|||
|
"-- Combining these, we get succ n + (m + p) = (succ n + m) + p.",
|
|||
|
"rw [h_pull_add_succ_out_from_left, h_inside_left_associates, h_push_succ_in_left_twice]"
|
|||
|
],
|
|||
|
"src_header_fl_solution": [
|
|||
|
"import Mathlib.Data.Nat.Basic",
|
|||
|
"import Aesop"
|
|||
|
]
|
|||
|
}
|
|||
|
]
|