了解后LT : Nat -> Nat -> Type
,我采取了不同的方法。我从声明开始:
natToFin : (j : Nat) -> {auto p : j `LT` n} -> Fin n
natToFin {n} j {p} = ?natToFin_rhs_1
. 将 case拆分n
,然后p
在n = Z
case 中拆分导致:
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
,一切都检查出来了。
现在唯一的问题是 Idris 似乎无法LT
自动找到证据。这就是发生的事情:
λΠ> the (Fin 6) (natToFin 2)
When elaborating argument p to function mod2.natToFin:
Can't solve goal
LT (fromInteger 2) (fromInteger 6)
有没有办法解决这个问题?