Я уже некоторое время борюсь за это. У меня есть индуктивный тип:Индуктивное определение для семейства типов
Definition char := nat.
Definition string := list char.
Inductive Exp : Set :=
| Lit : char -> Exp
| And : Exp -> Exp -> Exp
| Or : Exp -> Exp -> Exp
| Many: Exp -> Exp
, из которого я определяю семейство типов индуктивно:
Inductive Language : Exp -> Set :=
| LangLit : forall c:char, Language (Lit c)
| LangAnd : forall r1 r2: Exp, Language(r1) -> Language(r2) -> Language(And r1 r2)
| LangOrLeft : forall r1 r2: Exp, Language(r1) -> Language(Or r1 r2)
| LangOrRight : forall r1 r2: Exp, Language(r2) -> Language(Or r1 r2)
| LangEmpty : forall r: Exp, Language (Many r)
| LangMany : forall r: Exp, Language (Many r) -> Language r -> Language (Many r).
Рационального здесь является то, что дан регулярным выражением r:Exp
Я пытаюсь представить язык, связанный с r
как тип Language r
, и я делаю это с одним индуктивным определением.
Я хотел бы, чтобы доказать:.
Lemma L1 : forall (c:char)(x:Language (Lit c)),
x = LangLit c.
(Другими словами, тип Language (Lit c)
имеет только один элемент, то есть язык регулярного выражения 'c'
производится из одной строки "c"
Конечно, нужно определить некоторую семантику конвертирования элементы Language r
в string
)
Теперь специфика этой проблемы не является важной и просто служит, чтобы мотивировать свой вопрос: давайте использовать nat
вместо Exp
в го определят тип List n
, который представляет списки длины n
:
Parameter A:Set.
Inductive List : nat -> Set :=
| ListNil : List 0
| ListCons : forall (n:nat), A -> List n -> List (S n).
Здесь снова я использую один индуктивное определение, чтобы определить семейство типов List n
.
Я хотел бы, чтобы доказать:
Lemma L2: forall (x: List 0),
x = ListNil.
(другими словами, тип List 0
имеет только один элемент).
У меня закончились идеи по этому вопросу.
Обычно при попытке доказать (отрицательные) результаты с индуктивными типами (или предикатами), я хотел бы использовать elim
тактику (убедившись, вся соответствующая гипотеза внутри моей цели (generalize
), и только переменные встречаются в конструкторах типа). Но elim
не годится в этом случае.
Я также нашел это альтернативное доказательство: примените: eq_dep_eq; перемещение E: {1 2} 0 v => iz v; case: iz/v E. 'иногда полезно. Действительно, 'eq_dep' и подобные трюки могут быть очень полезны при работе с зависимыми типами. – ejgallego
Полное доказательство: https://x80.org/collacoq/kuxijefafo.coq – ejgallego
Версия без аксиом: https://x80.org/collacoq/imifulemof.coq – ejgallego