Я пытаюсь выполнить упражнение 4.6 из раздела «Программирование и доказательство в Isabelle / HOL». Он просит определить функцию elems :: "'a list ⇒ 'a set"
, которая преобразует список в набор, и доказать лемму "x ∈ elems xs ⟹ ∃ ys zs . xs = ys @ x # zs ∧ x ∉ elems ys"
. До сих пор я зашел так далеко:
fun elems :: "'a list ⇒ 'a set" where
"elems [] = {}" |
"elems (x # xs) = {x} ∪ elems xs"
lemma first_occ: "x ∈ elems xs ⟹ ∃ ys zs . xs = ys @ x # zs ∧ x ∉ elems ys"
proof (induction xs)
case Nil
thus ?case by simp
next
case (Cons u us)
show ?case
proof cases
assume "x = u"
thus ?case
proof
⟨…⟩
На этом этапе я получаю сообщение об ошибке «Не удалось применить метод первоначальной проверки». Это странно, поскольку цель ?case
- это суждение ∃ ys zs . u # us = ys @ x # zs ∧ x ∉ elems ys
, и должна быть возможность доказать экзистенциальные суждения, показав суждение под ∃
для конкретного свидетеля.