について学んだ後LT : Nat -> Nat -> Type
、私は別のアプローチをとりました。私は宣言から始めました:
natToFin : (j : Nat) -> {auto p : j `LT` n} -> Fin n
natToFin {n} j {p} = ?natToFin_rhs_1
. で大文字と小文字を分割しn
、その後でp
大文字と小文字を区別すると、次のようにn = Z
なりました。
natToFin : (j : Nat) -> {auto p : j `LT` n} -> Fin n
natToFin {n = (S k)} j {p = p} = ?natToFin_rhs_2
、これは本質的に私が求めていた証拠です。そこから、ケースを分割しj
てゼロケースを埋め、次のようにしました。
natToFin : (j : Nat) -> {auto p : j `LT` n} -> Fin n
natToFin {n = (S k)} Z = FZ
natToFin {n = (S k)} (S j) {p = p} = ?natToFin_rhs_3
. で埋めたかった?natToFin_rhs_3
のFS (natToFin j)
ですが、型チェッカーがそれをさせてくれませんでした。ただし、 でケースが分割された後p
は問題ありませんでした:
natToFin : (j : Nat) -> {auto p : j `LT` n} -> Fin n
natToFin {n = (S k)} Z = FZ
natToFin {n = (S k)} (S j) {p = (LTESucc x)} = FS (natToFin j)
最後に、 を追加total
し、すべてチェックアウトしました。
LT
唯一の問題は、Idris が証明を自動的に見つけられないように見えることです。これが起こることです:
λΠ> the (Fin 6) (natToFin 2)
When elaborating argument p to function mod2.natToFin:
Can't solve goal
LT (fromInteger 2) (fromInteger 6)
それを修正する方法はありますか?