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 还要注意的是,您提出的函数只会提供您是否需要定义以下函数的信息(即使您正确地对其进行了注释,

我在Coq里玩,试图创建一个排序列表。 我只是想要一个函数,它接受一个列表
[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.