Обобщите утверждение в структурном доказательстве индукции, чтобы иметь возможность использовать гипотезу индукции - PullRequest
2 голосов
/ 14 марта 2020

Я хочу доказать следующее

lemma
  fixes pi :: "'a path" and T :: "'a ts"
  shows "valid_path T pi s ⟹ ∀ op ∈ set pi. valid_operator T op"

по индукции на pi, где

fun valid_path :: "'a ts ⇒ 'a path ⇒ 'a state ⇒ bool" where
"valid_path T [] s = True" |
"valid_path T (op#ops) s = (valid_operator T op ∧ valid_path T ops (effect op s))

, а путь - это просто синоним типа для списка операторов. Другие определения не должны играть роль для доказательства.

Базовый случай работает нормально.

Проблема заключается в том, что неофициально для индуктивного шага, где pi = (x # xs) Я предполагаю, что

if valid_path T xs s
then ∀ op ∈ set xs. valid_operator T op

и я должен показать, что это подразумевает

if valid_path T (x#xs) s
then ∀ op ∈ set (x#xs). valid_operator T op

Я могу использовать здесь определение valid_path, так что это последнее выражение эквивалентно

if valid_path T (xs) (effect x s)
then ∀ op ∈ set (x#xs). valid_operator T op

Если бы я мог использовать гипотезу индукции на valid_path T (xs) (effect x s), я бы сделал.

Я бы не смог, так как гипотеза верна только для valid_path T (xs) s вместо valid_path T xs (effect x s).

Но это на самом деле не имеет значения, так как предикат того, что оператор if вообще не зависит от s!

Но Изабель не знает этого, поэтому она жалуется.

Как я могу сделать так, чтобы я мог применить индуктивную гипотезу к valid_path T (xs) (effect x s)? У меня есть ощущение, что я должен сделать утверждение более общим, чтобы я мог использовать гипотезу в доказательстве, но я не знаю, как.

1 Ответ

1 голос
/ 14 марта 2020

Очень часто вы должны обобщать некоторые термины в индукции. Используйте ключевое слово arbitrary в индуктивном методе.

proof (induct pi arbitrary: s)

Это объясняется в главе 2.4 Программирование и проверка в Изабель / HOL .

...