私はしばらくの間これを苦労してきました。正規表現r:Exp
私はr
に関連付けられた言語を表現しようとしていますが与えられ、ここでタイプのファミリーのための帰納的定義
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).
合理的:そこから私は、誘導タイプのファミリーを定義する
Definition char := nat.
Definition string := list char.
Inductive Exp : Set :=
| Lit : char -> Exp
| And : Exp -> Exp -> Exp
| Or : Exp -> Exp -> Exp
| Many: Exp -> Exp
:私は、誘導型を持っていますタイプLanguage r
として、私は単一の帰納的定義でそうしています。
私が証明したいと思います:正規表現'c'
の言語は単一の文字列"c"
で作られている。すなわち
Lemma L1 : forall (c:char)(x:Language (Lit c)),
x = LangLit c.
は(つまり、タイプLanguage (Lit c)
は、一つだけの要素を持っているもちろん、私は必要があります。今すぐ)string
にLanguage r
の要素を変換
をいくつかのセマンティクスを定義するには、この問題の詳細は重要ではなく、単に私の質問をやる気にさせる役割:私たちはnat
代わりのExp
とlを使用してみましょう私は種類List n
のファミリーを定義するために、単一の誘導性の定義を使用しています。ここで再び
Parameter A:Set.
Inductive List : nat -> Set :=
| ListNil : List 0
| ListCons : forall (n:nat), A -> List n -> List (S n).
:ら、私たちは、長さn
のリストを表しタイプList n
を定義します。
私が証明したいと思います:
Lemma L2: forall (x: List 0),
x = ListNil.
(つまり、タイプList 0
は一つだけの要素を持っています)。
私はこのアイデアを使い果たしました。
帰納的型(または述語)で(陰性)結果を証明しようとすると、関連するすべての仮説が目標(generalize
)内にあることが確認され、型コンストラクタ)。しかし、この場合はelim
は良いことではありません。
この代替証明は次のとおりです:eq_dep_eq;移動E:{1 2} 0 v => iz v;大文字小文字:iz/v E.'は時々役に立ちます。実際、 'eq_dep'などのトリックは、依存型を扱うときに非常に便利です。 – ejgallego
完全な証明:https://x80.org/collacoq/kuxijefafo.coq – ejgallego
公理のないバージョン:https://x80.org/collacoq/imifulemof.coq – ejgallego