Coq 护航模式与不等式匹配

Coq 护航模式与不等式匹配,coq,convoy-pattern,Coq,Convoy Pattern,我在实现简单函数时遇到了一个问题,我很确定答案是“护航模式”,但我就是不知道如何在这种特殊情况下应用它。以下是一个完整的示例: Require Import Coq.Lists.List. Definition index_map_spec (domain range: nat) := forall n : nat, n < domain -> {v : nat | v < range}. Lemma lt_pred_l {n m} (H: S n < m): n

我在实现简单函数时遇到了一个问题,我很确定答案是“护航模式”,但我就是不知道如何在这种特殊情况下应用它。以下是一个完整的示例:

Require Import Coq.Lists.List.

Definition index_map_spec (domain range: nat) :=
  forall n : nat, n < domain -> {v : nat | v < range}.

Lemma lt_pred_l {n m} (H: S n < m): n < m.
Proof. auto with arith. Defined.

Fixpoint natrange_f_spec
         (n:nat)
         {i o: nat}
         (nd: n<i)
         (f_spec: index_map_spec i o)
  : list nat
  :=
    match n return list nat with
    | 0 => nil
    | S n' => cons n' (natrange_f_spec n' (lt_pred_l nd) f_spec)
    end.
需要导入Coq.Lists.List。
定义索引\u映射\u规范(域范围:nat):=
对于所有n:nat,n{v:nat|vcons n'(自然范围f_规范n'(lt_pred_l nd)f_规范)
结束。
我得到的错误是:

The term "nd" has type "n < i" while it is expected to have type
 "S ?578 < ?579".
术语“nd”的类型为“n

因此,基本上我想以某种方式匹配'n',因为(n=sp)它将重写(n您只需在
match
上抽象出
nd
证明,相应地更改其返回类型:

Require Import Coq.Lists.List.

Definition index_map_spec (domain range: nat) :=
  forall n : nat, n < domain -> {v : nat | v < range}.

Lemma lt_pred_l {n m} (H: S n < m): n < m.
Proof. auto with arith. Defined.

Fixpoint natrange_f_spec
         (n:nat)
         {i o: nat}
         (nd: n<i)
         (f_spec: index_map_spec i o)
  : list nat
  :=
    match n return n < i -> list nat with
    | 0 => fun _ => nil
    | S n' => fun nd => cons n' (natrange_f_spec n' (lt_pred_l nd) f_spec)
    end nd.
需要导入Coq.Lists.List。
定义索引\u映射\u规范(域范围:nat):=
对于所有n:nat,n{v:nat|vfun=>nil
|SN'=>fun nd=>cons n'(Narange_f_规格n'(lt_pred_l nd)f_规格)
结束nd。