Как доказать формулы математической индукции в программе доказательства теорем LEAN?

Может ли кто-нибудь помочь мне понять, как написать доказательство простого результата, который можно легко получить с помощью индукции, например формулы для суммы первых n натуральных чисел: 1+2+...+n = n(n+1)/2, используя средство доказательства теорем LEAN?


person Vox    schedule 04.01.2020    source источник


Ответы (1)


Вот мое доказательство. Для работы вам понадобится mathlib.

import algebra.big_operators tactic.ring

open finset

example (n : ℕ) : 2 * (range (n + 1)).sum id = n * (n + 1) :=
begin
  induction n with n ih,
  { refl },
  { rw [sum_range_succ, mul_add, ih, id.def, nat.succ_eq_add_one],
    ring }
end

range (n + 1) - это набор натуральных чисел меньше n + 1, то есть от 0 до n.

Я использовал функцию finset.sum. Если s - финсет, а f - функция, то s.sum f - это $ \ sum_ {x \ in s} f (x) $.

Тактика induction делает индукцию. Тогда есть два случая. Случай n = 0 может быть выполнен с refl, поскольку это не более чем вычисление.

Индуктивный шаг может быть выполнен с rw. Используя VSCode, вы можете щелкнуть после каждой запятой в моем доказательстве, чтобы увидеть, что делает каждый rw. Это придает форму, которую решит тактика ring.

person Christopher Hughes    schedule 05.01.2020
comment
Я думаю это я использовал - person Christopher Hughes; 05.01.2020
comment
Кристофер, могу я попросить еще немного помощи? Я застрял с чем-то очень простым: theorem T ( a b : ℕ) (h1: a = 2) (h2: b = 3) : a < b := . Не могу заставить это работать вообще; хотя я получаю 2 < 3, используя nat.succ, похоже, я не могу изменить это на требуемый тип a<b. Сдался часа через два ... - person Vox; 08.01.2020
comment
Если вы import tactic.norm_num, то by norm_num это докажет. dec_trivial также работает, как и nat.lt_succ_self _. norm_num - рекомендуемый метод, так как он должен обеспечивать лучшую производительность для больших чисел. - person Christopher Hughes; 08.01.2020
comment
Если я сделаю это: theorem TT ( a b : ℕ) (h1: a = 2) (h2: b = 3) : a < b := begin exact nat.lt_succ_self a end Я получу a < succ a, но ожидал, что получит a<b. Это то, что я не могу пройти. Почему он не видит здесь b=succ a? Я сделал это с linarith и lt_add_one, но меня беспокоит, что я не могу понять, чего мне не хватает в другом подходе. - person Vox; 09.01.2020
comment
Извините, я неправильно прочитал вопрос. Вы должны сначала rw [h1, h2] . - person Christopher Hughes; 09.01.2020