подтверждение членства - PullRequest
2 голосов
/ 01 мая 2019

Мне нужно доказать следующее:

lemma  "m = min_list(x#xs) ⟹ m ∈ set (x#xs)"

Проще говоря, мне нужно доказать, что возвращаемое значение из "min_list (x # xs)" всегда является членом (x # xs)

Я пытался:

apply(induct xs)
apply(auto)

Я также попытался повторно использовать существующие леммы для min_list, используя:

find_theorems min_list

Подцель на этом этапе настолько длинна, что я не знаю, как действовать.

Я не ищу полный ответ, только подсказки о том, как подойти к этой лемме. Кроме того, является ли это доказательство простым или значительно трудным для того, кто только изучает Изабель?

1 Ответ

1 голос
/ 01 мая 2019

Спойлер: можно использовать стандартный список индукции и auto, чтобы доказать теорему, т.е. что-то похожее на by (induct xs ...) (auto simp: ...).Я сознательно пропустил разделы в доказательстве, чтобы вы могли заполнить их самостоятельно.Вам нужно будет подумать, нужно ли указывать какие-либо переменные (например, m или x) как arbitrary, а также понять, какая информация может понадобиться упрощающему (ищите подсказки в спецификации min_list в теорииList).

Что касается вашего вопроса о сложности проблемы, я полагаю, что сложность является функцией опыта.Скорее всего, когда я начал изучать Изабель, мне было трудно формализовать доказательства, подобные тому, что был в вашем вопросе.После некоторого времени, потраченного на кодирование в Isabelle (к моменту ответа на этот вопрос, я должен был накопить эквивалент 4-5 месяцев полного кодирования в Isabelle), такие проблемы больше не представляются значительнымивызов для меня.Конечно, есть и другие факторы, которые необходимо учитывать, например, предыдущее обучение математике или логике и предыдущий опыт программирования.


Общие советы от того, кто изучает Изабель самостоятельно(совет может не соответствовать подходу, который обычно рекомендуют профессиональные инструкторы)

Я считаю, что при доказательстве аналогичных результатов важно понимать, что Изабель, прежде всего, инструмент для формализации«ручку и бумагу» доказательства.Поэтому важно иметь под рукой «ручку и бумагу», прежде чем пытаться ее формализовать.Я бы предложил следующий общий подход при решении подобных проблем:

  1. Напишите доказательство на бумаге.
  2. Формализируйте доказательство, используя Isar, предоставляя как можно больше деталей и не заботясьслишком много о длине доказательства.Кроме того, постарайтесь не полагаться на инструменты для автоматического рассуждения (например, auto, blast, meson, metis, fastforce) и использовать прямые методы, такие как rule и intro, так как выcan.
  3. После того, как ваше Isar доказательство выполнено, примените инструменты для автоматического рассуждения (например, auto, blast) к вашему доказательству Isar, чтобы максимально упростить ваше доказательство.

Конечно, со временем, когда вы добьетесь прогресса в изучении Изабель, будет все легче опускать 1 и 2.

Я могу предоставить более подробную информацию, например, полное краткое доказательство идлинная Isar версия доказательства.


ОБНОВЛЕНИЕ

Согласно вашему запросу в комментариях, я предоставляю неофициальное доказательство.

Лемма .m = min_list (x # xs) ⟹ m ∈ set (x # xs).

Замечания .Для полноты изложения я также даю определение min_list и некоторые комментарии о const set.Определение min_list можно найти в теории List:

fun min_list :: "'a::ord list ⇒ 'a" where
"min_list (x # xs) = (case xs of [] ⇒ x | _ ⇒ min x (min_list xs))"

const set определен неявно и является частью инфраструктуры datatype для list (см.документ «Определение (Co) типов данных и примитивно (Co) рекурсивных функций в Изабель / HOL» в стандартной документации, если Изабель).В частности, это называется «функция установки» типа данных.Многие основные свойства const set могут быть найдены при проверке / поиске, например, find_theorems list.set.Я полагаю, что теорема thm list.set представляет основные свойства const set (я позволил себе переименовать схематические переменные в теореме):

set [] = {}
set (?x # ?xs) = insert ?x (set ?xs)

Доказательство .Доказательством служит структурная индукция в списке xs.Принцип индукции сформулирован как безымянная лемма в начале теории List.Для полноты излагаю принцип индукции ниже:

"P [] ⟹ (⋀a list. P list ⟹ P (a # list)) ⟹ P list"

Базовый случай : предположим, xs = [], показать m = min_list (x # xs) ⟹ m ∈ set (x # xs) для всех x.Из определения min_list легко понять, что min_list (x # []) = x.Точно так же set (x # []) = {x} может быть показано непосредственно из свойств const set.Подставляя в предикат выше, осталось показать, что m = x ⟹ m ∈ {x} для всех x.Это следует из базовой теории множеств.

Индуктивный шаг : предположим, ⋀x. m = min_list (x # xs) ⟹ m ∈ set (x # xs), показать m = min_list (a # x # xs) ⟹ m ∈ set (a # x # xs) для всех a, x и xs. Исправьте a, x и xs. Предположим, m = min_list (a # x # xs). Тогда осталось показать, что m ∈ set (a # x # xs). Учитывая m = min_list (a # x # xs), из определения min_list, легко сделать вывод, что либо m = a, либо m = min_list (x # xs). Рассмотрим эти случаи в явном виде:

  • Случай I: m = a. a ∈ set (a # x # xs) следует из определений. Затем m ∈ set (a # x # xs) путем подстановки.
  • Случай II: m = min_list (x # xs). Тогда из предположения ⋀x. m = min_list (x # xs) ⟹ m ∈ set (x # xs) следует, что m ∈ set (x # xs). Таким образом, m ∈ set (a # x # xs) следует из свойств set.

Во всех возможных случаях m ∈ set (a # x # xs), что и требовалось доказать.

Итак, доказательство завершено.

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

...