Может ли кто-нибудь помочь мне понять, как написать доказательство простого результата, который можно легко получить с помощью индукции, например формулы для суммы первых n
натуральных чисел: 1+2+...+n = n(n+1)/2
, используя средство доказательства теорем LEAN?
Как доказать формулы математической индукции в программе доказательства теорем LEAN?
Ответы (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
Я думаю это я использовал
- person Christopher Hughes; 05.01.2020
Кристофер, могу я попросить еще немного помощи? Я застрял с чем-то очень простым:
theorem T ( a b : ℕ) (h1: a = 2) (h2: b = 3) : a < b :=
. Не могу заставить это работать вообще; хотя я получаю 2 < 3
, используя nat.succ
, похоже, я не могу изменить это на требуемый тип a<b
. Сдался часа через два ...
- person Vox; 08.01.2020
Если вы
import tactic.norm_num
, то by norm_num
это докажет. dec_trivial
также работает, как и nat.lt_succ_self _
. norm_num
- рекомендуемый метод, так как он должен обеспечивать лучшую производительность для больших чисел.
- person Christopher Hughes; 08.01.2020
Если я сделаю это:
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
Извините, я неправильно прочитал вопрос. Вы должны сначала
rw [h1, h2]
.
- person Christopher Hughes; 09.01.2020