Coq 模式匹配不是专门的类型
我在Coq里玩,试图创建一个排序列表。 我只是想要一个函数,它接受一个列表Coq 模式匹配不是专门的类型,coq,theorem-proving,dependent-type,Coq,Theorem Proving,Dependent Type,我在Coq里玩,试图创建一个排序列表。 我只是想要一个函数,它接受一个列表[1,2,3,2,4],并返回类似于排序的[1,2,3,4]——即取出坏的部分,但实际上不排序整个列表 我想首先定义一个类型为(mn:nat)->选项的函数lesseq(m您想将此函数作为练习编写,还是仅仅为了实现更大的目标?在后一种情况下,您应该查看标准库,其中充满了可以完成此任务的决策函数;请参见示例le\u gt\u dec 还要注意的是,您提出的函数只会提供您是否需要定义以下函数的信息(即使您正确地对其进行了注释,
[1,2,3,2,4]
,并返回类似于排序的[1,2,3,4]
——即取出坏的部分,但实际上不排序整个列表
我想首先定义一个类型为
(mn:nat)->选项的函数lesseq
(m您想将此函数作为练习编写,还是仅仅为了实现更大的目标?在后一种情况下,您应该查看标准库,其中充满了可以完成此任务的决策函数;请参见示例le\u gt\u dec
还要注意的是,您提出的函数只会提供您是否需要定义以下函数的信息(即使您正确地对其进行了注释,您[le_S m n x]也没有您想要的类型):
Fixpoint-lesseq(mn:nat):选项(m
匹配
|0=>Some(leu n 0)
|S m0=>无
结束
|标准普尔=>
将lesseq m p与
|Some l=>Some(le_S m p l)
|无=>无
结束
结束。
但是正如你所注意到的,打字机没有足够的聪明去猜答案
当您解构出现在
结果。必须按以下方式对匹配项进行注释:
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match n return (option (m <= n)) with
| 0 =>
match m return (option (m <= 0)) with
| 0 => Some (le_n 0)
| S m0 => None
end
| S p =>
match lesseq m p with
| Some l => Some (le_S m p l)
| None => None
end
end.
Fixpoint-lesseq(mn:nat):选项(无
结束
|标准普尔=>
将lesseq m p与
|Some l=>Some(le_S m p l)
|无=>无
结束
结束。
如果您真的想了解模式的使用方法,请参阅参考手册
匹配适用于依赖类型。如果你觉得不够勇敢
为此,你宁愿使用战术机制来建立你的证据
(改进策略是一个很好的工具)
Definition lesseq m n:option(顺便说一句,如果您采用这种方法,我强烈建议您使用程序功能。它允许您以第一个列表的样式编写程序,但会留下任意数量的“漏洞”(41;),然后您可以使用策略(第二个列表的样式)来“填充”。因此,它允许您很好地将编程和验证分开。谢谢你们两位的帮助。我有很多东西要学习,但我不知道您可以使用策略来定义函数(尽管这很有意义)。我现在同意a和类型(a b)那就太好了,因为我在需要时通过返回None实现了错误的lesseq;对于更具体的类型,这是不可能的。我肯定也会再看看标准库。
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match m with
| 0 => match n with
| 0 => Some (le_n 0)
| S n_ => None
end
| S m_ => match n with
| 0 => None
| S _ => match lesseq m_ n with
| Some x=> le_S m n x
| None => None
end
end
end.
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match n with
| 0 =>
match m with
| 0 => Some (le_n 0)
| S m0 => None
end
| S p =>
match lesseq m p with
| Some l => Some (le_S m p l)
| None => None
end
end.
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match n return (option (m <= n)) with
| 0 =>
match m return (option (m <= 0)) with
| 0 => Some (le_n 0)
| S m0 => None
end
| S p =>
match lesseq m p with
| Some l => Some (le_S m p l)
| None => None
end
end.
Definition lesseq m n : option (m <= n).
refine (fix lesseq (m : nat) (n : nat) {struct n} := _).
destruct n.
destruct m.
apply Some; apply le_n.
apply None.
destruct (lesseq m n).
apply Some.
apply le_S.
assumption.
apply None.
Defined.