【发布时间】:2016-05-21 19:02:22
【问题描述】:
我已经为此苦苦挣扎了一段时间。我有一个归纳类型:
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"组成的。当然我需要定义@的一些语义转换元素987654330@转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在这种情况下就不行了。
【问题讨论】:
标签: coq