Coq 我们能禁止那些不符合';不符合条件吗?
我想部分派生其输入是依赖列表的函数Coq 我们能禁止那些不符合';不符合条件吗?,coq,dependent-type,Coq,Dependent Type,我想部分派生其输入是依赖列表的函数 deriveP有一个错误,因为长度的eucapend fk(pk::lk)并不总是n,但I总是需要长度为p的列表 这是由于lastk和firstk的定义造成的。 要解决此问题,lastk和firstk必须仅返回Euc k,而不是Euc n。 我想禁止n和k不满足k的参数,您可以使用您提到的顺序关系。我的建议是避免在您的定义中进行证明(这会使事后证明更加复杂),例如: Fixpoint lastk k n : Euc n -> k < n ->
deriveP
有一个错误,因为长度的eucapend fk(pk::lk)
并不总是n,但I
总是需要长度为p的列表
这是由于lastk
和firstk
的定义造成的。
要解决此问题,lastk
和firstk
必须仅返回Euc k
,而不是Euc n
。
我想禁止n和k不满足
k的参数,您可以使用您提到的顺序关系。我的建议是避免在您的定义中进行证明(这会使事后证明更加复杂),例如:
Fixpoint lastk k n : Euc n -> k < n -> Euc k :=
match n with
|0 => fun _ (H : k < 0) => False_rect _ (Lt.lt_n_O _ H)
|S n => match k with
|S m => fun v H => snoc (lastk (but_last v) (le_S_n _ _ H)) (last v)
|0 => fun _ H => []
end
end.
Fixpoint firstk k n : Euc n -> k < n -> Euc k :=
match n with
|0 => fun _ (H : k < 0) => False_rect _ (Lt.lt_n_O _ H)
|S n => match k with
|S m => fun v H => (head v) ::: firstk (tail v) (le_S_n _ _ H)
|0 => fun _ H => []
end
end.
固定点lastk n:Euc n->kEuc k:=
匹配
|0=>fun(H:k<0)=>False(Lt.Lt\n\u O\uh)
|sn=>将k与
|S m=>fun v H=>snoc(lastk(但最后一个v)(leu S_n_H))(最后一个v)
|0=>乐趣H=>[]
结束
结束。
不动点第一k n:Euc n->kEuc k:=
匹配
|0=>fun(H:k<0)=>False(Lt.Lt\n\u O\uh)
|sn=>将k与
|S m=>乐趣v H=>(头五)::第一个(尾五)
|0=>乐趣H=>[]
结束
结束。
这个定义是透明的,这使得在使用KN作为感应点后很容易证明。
vectodef库可用于(有限序列)。您可以做一个变通方法,以便于提取定义:
Fixpoint of_nat {n} (x : t n) : nat :=
match x with
|@F1 _ => 0
|@FS _ y => S (of_nat y)
end.
Fixpoint lastk n (H : t n) (v : Euc n) : Euc (of_nat H) :=
match H as t in (t n0) return (Euc n0 -> Euc (of_nat t)) with
| @F1 n0 => fun=> [ ]
| @FS n0 H1 =>
fun H2 : Euc (S n0) => snoc (lastk H1 (but_last H2)) (last H2)
end v.
Theorem of_nat_eq : forall y k (H : k < y), of_nat (of_nat_lt H) = k.
intros y k.
elim/@nat_double_ind : y/k.
intros;inversion H.
intros; auto.
intros; simply.
by rewrite -> (H (Lt.lt_S_n _ _ H0)).
Qed.
Definition last_leb n k (v : Euc n) : k < n -> Euc k.
intros.
rewrite <- (of_nat_eq H).
exact (@lastk _ (of_nat_lt H) v).
Show Proof.
Defined.
_nat{n}(x:tn):nat:=
将x与
|@F1 979;=>0
|@FS y=>S(当然)
结束。
不动点lastk n(H:tn)(v:Euc n):Euc(of_nath):=
在(tn0)返回(Euc n0->Euc(of_nat t))中将H匹配为t
|@F1 n0=>乐趣=>[]
|@FS n0 H1=>
乐趣H2:Euc(sn0)=>snoc(lastk H1(但最后H2))(最后H2)
结束五。
自然等式定理:对于所有yk(H:k(H(Lt.Lt\u S\u n\uh0))。
Qed。
定义最后一行k(v:Euc n):kEuc k。
介绍。
重写您可以使用您提到的顺序关系。我的建议是避免在您的定义中进行证明(这会使事后证明更加复杂),例如:
Fixpoint lastk k n : Euc n -> k < n -> Euc k :=
match n with
|0 => fun _ (H : k < 0) => False_rect _ (Lt.lt_n_O _ H)
|S n => match k with
|S m => fun v H => snoc (lastk (but_last v) (le_S_n _ _ H)) (last v)
|0 => fun _ H => []
end
end.
Fixpoint firstk k n : Euc n -> k < n -> Euc k :=
match n with
|0 => fun _ (H : k < 0) => False_rect _ (Lt.lt_n_O _ H)
|S n => match k with
|S m => fun v H => (head v) ::: firstk (tail v) (le_S_n _ _ H)
|0 => fun _ H => []
end
end.
固定点lastk n:Euc n->kEuc k:=
匹配
|0=>fun(H:k<0)=>False(Lt.Lt\n\u O\uh)
|sn=>将k与
|S m=>fun v H=>snoc(lastk(但最后一个v)(leu S_n_H))(最后一个v)
|0=>乐趣H=>[]
结束
结束。
不动点第一k n:Euc n->kEuc k:=
匹配
|0=>fun(H:k<0)=>False(Lt.Lt\n\u O\uh)
|sn=>将k与
|S m=>乐趣v H=>(头五)::第一个(尾五)
|0=>乐趣H=>[]
结束
结束。
这个定义是透明的,这使得在使用KN作为感应点后很容易证明。
vectodef库可用于(有限序列)。您可以做一个变通方法,以便于提取定义:
Fixpoint of_nat {n} (x : t n) : nat :=
match x with
|@F1 _ => 0
|@FS _ y => S (of_nat y)
end.
Fixpoint lastk n (H : t n) (v : Euc n) : Euc (of_nat H) :=
match H as t in (t n0) return (Euc n0 -> Euc (of_nat t)) with
| @F1 n0 => fun=> [ ]
| @FS n0 H1 =>
fun H2 : Euc (S n0) => snoc (lastk H1 (but_last H2)) (last H2)
end v.
Theorem of_nat_eq : forall y k (H : k < y), of_nat (of_nat_lt H) = k.
intros y k.
elim/@nat_double_ind : y/k.
intros;inversion H.
intros; auto.
intros; simply.
by rewrite -> (H (Lt.lt_S_n _ _ H0)).
Qed.
Definition last_leb n k (v : Euc n) : k < n -> Euc k.
intros.
rewrite <- (of_nat_eq H).
exact (@lastk _ (of_nat_lt H) v).
Show Proof.
Defined.
_nat{n}(x:tn):nat:=
将x与
|@F1 979;=>0
|@FS y=>S(当然)
结束。
不动点lastk n(H:tn)(v:Euc n):Euc(of_nath):=
在(tn0)返回(Euc n0->Euc(of_nat t))中将H匹配为t
|@F1 n0=>乐趣=>[]
|@FS n0 H1=>
乐趣H2:Euc(sn0)=>snoc(lastk H1(但最后H2))(最后H2)
结束五。
自然等式定理:对于所有yk(H:k(H(Lt.Lt\u S\u n\uh0))。
Qed。
定义最后一行k(v:Euc n):kEuc k。
介绍。
重写
Fixpoint of_nat {n} (x : t n) : nat :=
match x with
|@F1 _ => 0
|@FS _ y => S (of_nat y)
end.
Fixpoint lastk n (H : t n) (v : Euc n) : Euc (of_nat H) :=
match H as t in (t n0) return (Euc n0 -> Euc (of_nat t)) with
| @F1 n0 => fun=> [ ]
| @FS n0 H1 =>
fun H2 : Euc (S n0) => snoc (lastk H1 (but_last H2)) (last H2)
end v.
Theorem of_nat_eq : forall y k (H : k < y), of_nat (of_nat_lt H) = k.
intros y k.
elim/@nat_double_ind : y/k.
intros;inversion H.
intros; auto.
intros; simply.
by rewrite -> (H (Lt.lt_S_n _ _ H0)).
Qed.
Definition last_leb n k (v : Euc n) : k < n -> Euc k.
intros.
rewrite <- (of_nat_eq H).
exact (@lastk _ (of_nat_lt H) v).
Show Proof.
Defined.