При попытке доказать леммы о функциях в стиле продолжения прохождения по индукции я столкнулся с проблемой со свободными переменными типа. В моей гипотезе индукции продолжение представляет собой переменную типа , но ее тип включает тип. В результате Isabelle не может унифицировать переменную типа с конкретным типом, когда я пытаюсь применить i.h. Я приготовил этот минимальный пример:Свободные переменные типа в доказательстве по индукции
fun add_k :: "nat ⇒ nat ⇒ (nat ⇒ 'a) ⇒ 'a" where
"add_k 0 m k = k m" |
"add_k (Suc n) m k = add_k n m (λn'. k (Suc n'))"
lemma add_k_cps: "∀k. add_k n m k = k (add_k n m id)"
proof(rule, induction n)
case 0 show ?case by simp
next
case (Suc n)
have "add_k (Suc n) m k = add_k n m (λn'. k (Suc n'))" by simp
also have "… = k (Suc (add_k n m id))"
using Suc[where k="(λn'. k (Suc n'))"] by metis
also have "… = k (add_k n m (λn'. Suc n'))"
using Suc[where k="(λn'. Suc n')"] sorry (* Type unification failed *)
also have "… = k (add_k (Suc n) m id)" by simp
finally show ?case .
qed
В «жалком шаге», явная конкретизация схематических переменной ?k
завершается с
Type unification failed
Failed to meet type constraint:
Term: Suc :: nat ⇒ nat
Type: nat ⇒ 'a
так 'a
свободно и не схематичные. Без создания экземпляра упрощение в любом случае не срабатывает, и я не мог найти другие методы, которые могли бы работать.
Поскольку я не могу количественно описать типы, я не вижу никакого способа, как сделать код 'a
внутри доказательства. Когда переменная члена становится схематически локально внутри доказательства, почему это не так с переменными в его типе? После того как лемма доказана, они все равно становятся схематическими на уровне теории. Это кажется весьма ограниченным. Может ли вариант сделать это в будущем или существует какое-то присущее ограничение? Альтернативно, существует ли подход, чтобы избежать этой проблемы и все еще сохраняя продолжение схематически полиморфным в доказанной лемме?