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.