169 похожих чатов

Извините за глупые вопросы, но как доказать, что функция, которая

вычисляет сумму всех элементов списка, работает корректно?
В наивном виде:
sumArray :: [Int] -> Int
sumArray [] = 0
sumArray (x:xs) = x + sumArray xs

Можно и так:
sumArray :: [Int] -> Int
sumArray lst = go lst 0
where
go [] acc = acc
go (x:xs) acc = go xs (x + acc)

13 ответов

7 просмотров

Индукцией

ну сначала определяешь что такое "сумма элементов списка". Это такая наивная функция сложения списка. Потом доказываешь что твоя функция равна этой на любом списке но твоя функция прям такая же будет на пустом списке они равны на непустом они равны для хвоста, и и с каждой стороны от равенства мы добавляем одинаковое число

а не увидел вторую версию

кана
ну сначала определяешь что такое "сумма элементов ...

тогда надо доказать корректность кода через соответствие реализации определению

кана
не понял

мы долго обсуждали, как доказать, что написанный код считает именно сумму по идукции. но доказать надо было не совсем это, а корректность кода. можно взять рекурсивную формулу вычисления суммы списка, который очевидно правильный, и доказывать уже, что код соответствует формуле, написанной на бумаге

@[simp] def sum₁ : List Nat → Nat | [] => 0 | x::xs => x + sum₁ xs @[simp] private def sum₂' (acc : Nat) : List Nat → Nat | [] => acc | x::xs => sum₂' (x + acc) xs def sum₂ : List Nat → Nat := sum₂' 0 private theorem sum₂'_correct : sum₂' acc xs = sum₁ xs + acc := by induction xs generalizing acc with | nil => simp | cons x xs ih => simp [Nat.add_assoc, Nat.add_left_comm, ih] theorem sum₂_correct : sum₂ = sum₁ := by funext xs; apply sum₂'_correct

ㅤ-Атеист Автор вопроса
кана
@[simp] def sum₁ : List Nat → Nat | [] => 0 | x::x...

А, прикольно! Спасибо! ❤️ (почему в хаскель-чате нет реакции "❤️"? неужели хаскелисты такие бессердечные??) Базовый случай: []. 0 = 0 Допустим, что sum₂' acc xss = sum₁ xss + acc и xss = x:xs Тогда если справедливо sum₂' acc1 xs = sum₁ xs + acc1, то утверждение верно. Тогда по определению: sum₂' (x + acc) xs = x + sum₁ xs + acc Вследствие ассоциативности сложения получаем: sum₂' (x + acc) xs = sum₁ xs + (x + acc) ч.т.д. Ну и для доказательства sum₂ xs = sum₁ xs: sum₂' 0 xs = sum₁ xs + 0 (a + 0 = a) По предыдущей теореме данное утверждение верно, а значит и верно исходное утверждение

ㅤ Атеист
А, прикольно! Спасибо! ❤️ (почему в хаскель-чате н...

есть еще вот такой способ в lean4 это раписать для читаемости private theorem sum₂'_correct : sum₂' acc xs = sum₁ xs + acc := by induction xs generalizing acc with | nil => simp | cons x xs ih => calc sum₂' acc (x :: xs) = sum₂' (x + acc) xs := by rfl _ = sum₁ xs + (x + acc) := by apply ih _ = x + sum₁ xs + acc := by simp [Nat.add_assoc, Nat.add_left_comm] _ = sum₁ (x :: xs) + acc := by rfl

кана
есть еще вот такой способ в lean4 это раписать для...

вообще вот эта задача + задача на reverse скажем это такая классическая задача на доказательства, которая обучает, что не всегда стоит индукцию применять бездумно, нужно сначала подумать а для чего именно индуцировать, а так же думать, с каким мативом индуцировать. В книжках обычно одна из этих двух задач есть вот тут скажем два момента важных это: 1. индуцировать нужно для sum₂' а не для sum₂ 2. индукция должна быть обобщена по acc, потому что с каждым шагом функции acc меняется вот есть статьейка еще с подобными задачами https://jamesrwilcox.com/InductionExercises.html

ㅤ-Атеист Автор вопроса
кана
вообще вот эта задача + задача на reverse скажем э...

Я взял эту задачу из CLRS (4-я редакция! цвета появились!)

ㅤ-Атеист Автор вопроса
кана
вообще вот эта задача + задача на reverse скажем э...

Касательно reverse list неплохо было бы узнать μ(reverse)

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
11
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
это группа токсиков или тех кто помогает?
Ибрагим
9
Я короче решил скомпилировать Nim в js, я думал он сработает как обычный транслятор. По итогу он мне создал файл с расширением js, и туда поместил кучу кода Вопрос, что это з...
𝕾𝖍𝖆𝖉𝖊 <suspense>
8
мы пытаемся подменить функцию, которая имеет меньше инструкций относительно функции, которой подменяем. https://www.reddit.com/r/jailbreakdevelopers/comments/w06ujy/mshookfun...
Óðinn
6
У кого-нибудь есть под рукой функция кодирования юникода, которая из фразы На русском сделает \u041d\u0430\u0020\u0440\u0443\u0441\u0441\u043a\u043e\u043c ?
Daniil Smolyakov
7
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта