Доказательство правильности функции суммирования со счетчиком

Учитывая следующую функцию суммирования:

function sum :: "nat ⇒ nat ⇒ nat" where
"sum i N = (if i > N then 0 else i + sum (Suc i) N)"
by pat_completeness auto
termination sum
apply (relation "measure (λ(i,N). N + 1 - i)")
apply auto
done

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

Не могли бы вы предоставить решение и объяснение следующего доказательства?

lemma sum_general[simp] : "c ≤ n ⟹ 2 * sum c n + (c - 1) * c = n * (n + 1)

Вы должны сначала уточнить, что вы подразумеваете под «теоремой правильности». Вы хотите связать определенную функцию со стандартным оператором суммирования в Isabelle-HOL? Вы хотите доказать закрытую форму для этой суммы? Также обратите внимание, что хотя вы могу делаете это таким образом, обычно лучше выполнять рекурсию вниз, а не вверх, как вы это сделали.

Manuel Eberl 14.05.2019 15:35

@ManuelEberl Я родом из Coq, и эта функция действительно показалась мне очень интересной. Я сделал быстрый поиск и нашел это определение на странице 4 isabelle.in.tum.de/doc/functions.pdf. Я пришел с общей леммой, леммой sum_general[simp] : "c ≤ n ⟹ 2 * sum cn + (c - 1) * c = n * (n + 1)", но я не могу применить обоснованную индукцию по c <= п. Любой намек был бы замечательным.

keep_learning 14.05.2019 15:47

@keep_learning Я добавлю лемму к моему основному вопросу, спасибо.

P. Ez 14.05.2019 15:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы хотите доказать что-то о рекурсивно определенной функции, которую вы определили с помощью команды function, и где рекурсия выходит за рамки примитивной рекурсии, обычно лучше всего использовать правило индукции, которое дает вам команда function:

lemma "i ≤ N ⟹ N * Suc N = 2 * sum i N + i * (i - 1)"
proof (induction i N rule: sum.induct)
  case (1 i N)
  show ?case
  proof (cases "i = N")
  case True
  thus ?thesis sorry
next
  case False
  thus ?thesis sorry
qed

Это дает вам доступ к гипотезе индукции как «1.IH». Я также уже добавил различие в регистре, которое вам понадобится.

Обратите внимание, что пакет function регистрирует определяющее уравнение sum (sum.simps) как правило simp. Это не очень хорошая идея, потому что это может сделать цикл упрощения, поскольку уравнение не защищено. Я обычно удаляю уравнение из набора упрощенных и добавляю защищенные версии, чтобы избежать этого:

lemmas [simp del] = sum.simps

lemma sum_simps [simp]: "i > N ⟹ sum i N = 0" "i ≤ N ⟹ sum i N = i + sum (Suc i) N"
  by (auto simp: sum.simps)

Другие вопросы по теме