私はCoqで遊んでいて、ソートされたリストを作成しようとしています。リスト[1,2,3,2,4]
を取得して、次のような関数を返す関数が必要Sorted [1,2,3,4]
でした。つまり、不良部分を削除しますが、実際にはリスト全体を並べ替えることはありません。
lesseq
タイプの関数を定義することから始めようと思ったのですが(m n : nat) -> option (m <= n)
、それからパターンマッチングをかなり簡単に行うことができました。多分それは悪い考えです。
私が今抱えている問題の核心はそれです(スニペット、下部の関数全体)
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)
です。m
その文脈では明らかに両方と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.
おそらく私は自分より進んでいて、これに取り組む前に読み続ける必要があります。