В Изабель я пытаюсь сделать индукцию правила по взаимно рекурсивным индуктивным определениям. Вот самый простой пример, который я был в состоянии создать:Как исправить «Незаконная схематическая переменная (ы)» в индукции взаимного рекурсивного правила?
theory complex_exprs
imports Main
begin
datatype A = NumA int
| AB B
and B = NumB int
| BA A
inductive eval_a :: "A ⇒ int ⇒ bool" and eval_b :: "B ⇒ int ⇒ bool" where
eval_num_a: "eval_a (NumA i) i" |
eval_a_b: "eval_b b i ⟹ eval_a (AB b) i" |
eval_num_b: "eval_b (NumB i) i" |
eval_b_a: "eval_a a i ⟹ eval_b (BA a) i"
lemma foo:
assumes "eval_a a result"
shows "True"
using assms
proof (induction a)
case (NumA x)
show ?case by auto
case (AB x)
На данный момент, Изабель останавливается с "Illegal схематическом переменной (ы) в случае, если„АБ“. Действительно, текущая цель ⋀x. ?P2.2 x ⟹ eval_a (AB x) result ⟹ True
которая содержит предположение ?P2.2 x
. Это «схематическая переменная», о которой говорит Изабель? Откуда он исходит, и как я могу избавиться от него?
я получаю ту же проблему, если я пытаюсь сделать индукцию по правилам:
proof (induction)
case (eval_num_a i)
show ?case by auto
case (eval_a_b b i)
Опять же, цель ⋀b i. eval_b b i ⟹ ?P2.0 b i ⟹ True
с неизвестным ?P2.0 b i
, и я не могу продолжать.
Как связанный с этим вопрос: я пытался сделать индукцию с помощью
proof (induction rule: eval_a_eval_b.induct)
но Изабель не принимает это, говоря: "Не удалось применить первоначальный метод доказательства.
Как я могу сделать эту индукцию? (В моем фактическом применении мне действительно нужна индукция, потому что цель сложнее, чем True
.)
Спасибо! Ты посадил меня на правильный путь. Еще одна вещь, в которой я нуждалась, и которую я нашел через приведенные вами примеры, - это ключевое слово '' and'', которое мне нужно для моего варианта использования. Я хотел доказать это: лемма eval_a_eval_b_deterministic: показывает «eval_a топор ⟹ eval_a топор„⟹ х = х“» и «eval_b по ⟹ eval_b по„⟹ у = у“» , которые я теперь могу сделать (используя вспомогательную лемму). –