Types Coq程序对匹配

Types Coq程序对匹配,types,subset,coq,Types,Subset,Coq,我试图使用子集类型为列表执行一个安全的get函数。我试着用这个程序来定义 Program Fixpoint get A (l : list A) (n : {x : nat | x < length l} ) : A := match (n, l) with | (O, x :: l') => x | (S n', x :: l') => get l' n' | _ => _ end. 程序固定点获取A(l:list A)(n:{x:nat|xO e

我试图使用子集类型为列表执行一个安全的
get
函数。我试着用这个程序来定义

Program Fixpoint get A (l : list A) (n : {x : nat | x < length l} ) : A :=
  match (n, l) with
  | (O, x :: l') => x
  | (S n', x :: l') => get l' n'
  | _ => _
  end.
程序固定点获取A(l:list A)(n:{x:nat|xx
|(sn',x::l')=>获取l'n'
| _ => _
结束。
问题是它会得到以下错误

找到了归纳类型nat的构造函数,而找到了sig的构造函数
预计为。


为什么coq不让我成对地进行包含子集类型的模式匹配?

您有一个
sig
,您正在尝试获取一个nat。
sig
是一个nat,有证据证明:。您需要在
proj1\u sig n
上进行匹配,这将打开编号。你可以把符号
{x | px}
想象成一个元组(从技术上讲,它是一个依赖和):


因此,每当你看到
{x | p}
时,你就会认为它是
(x,p)
。问题在于,您期望的是一个类型不同的
n

问题在于,多个值的模式匹配形式在Coq中是特殊的。你需要这样写:

Program Fixpoint get A (l : list A) (n : {x : nat | x < length l} ) : A :=
  match n, l with
  | O, x :: l' => x
  | S n', x :: l' => get _ l' n'
  | _, _ => _
  end.
程序固定点获取A(l:list A)(n:{x:nat|xx
|sn',x::l'=>获取
| _, _ => _
结束。

在以前的版本中,实际上是对
(n,l)
进行模式匹配,而不是同时对
n
l
进行模式匹配,并且
程序可能因此而变得混乱

我知道这是一个信号。但是对于程序coq,让我们做一些事情,比如“程序定义foo(n:{x:nat|x>O}):=match n with O=>O|sn'=>O end。”我不知道在模式匹配一对时,它不让做同样的事情的形式原因是什么。
Program Fixpoint get A (l : list A) (n : {x : nat | x < length l} ) : A :=
  match n, l with
  | O, x :: l' => x
  | S n', x :: l' => get _ l' n'
  | _, _ => _
  end.