模式匹配不是专业类型
|
我在Coq中玩耍,试图创建一个排序列表。
我只是想要一个接受列表takes0ѭ并返回类似
Sorted [1,2,3,4]
的函数-即取出不良部分,但实际上不对整个列表进行排序。
我以为我将从定义类型为(m n : nat) -> option (m <= n)
的函数lesseq
开始,然后可以很容易地对它进行模式匹配。也许那是一个坏主意。
我现在遇到的问题的症结在于(摘要,整个功能位于底部)
Fixpoint lesseq (m n : nat) : option (m <= n) :=
match m with
| 0 => match n with
| 0 => Some (le_n 0)
...
没有进行类型检查;它表示期望为option (m <= n)
,但是Some (le_n 0)
的类型为option (0 <= 0)
。我不明白,因为显然context8ѭ和n
在这种情况下都是零,但是我不知道该如何告诉Coq。
整个功能是:
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.
也许我正在超越自己,只需要继续阅读就可以解决这个问题。
没有找到相关结果
已邀请:
2 个回复
缕嚏冻
但是,您已经注意到,类型检查器不够聪明,无法猜测 销毁以类型出现的变量时的新上下文 结果。您必须通过以下方式注释匹配:
如果您真的想了解模式,请参阅参考手册。 匹配适用于依赖类型。如果你不够勇敢 为此,您宁愿使用战术机制来建立证据 (“优化”策略是实现这一目标的绝佳工具)。
顺便说一句,我认为您的功能不会真正有用 (即使是个好主意),因为您需要证明 以下引理: 引理lesseq_complete: forall m n,lesseq m n <>无-> m> n。 这就是为什么人们使用Coq.Arith.Compare_dec的原因。 玩得开心。
味芯憨
。 还要注意,您建议的功能仅会向您提供信息
。对于模式匹配,和类型
更为有用,它为您提供了两种可能的情况。