我正在尝试使用(j : Nat) -> {auto p : So (j < n)} -> Fin n
类型的Idris函数将Nat
转换为Fin n
。为了使Z
案例有效(并输出FZ
),我试图证明0 < n
的证据足以使FZ : Fin n
成为可能。但我无法弄清楚如何做到这一点。
我愿意做一个完全不同的功能,只要它可以将Nat
值转换为Fin n
值(它们存在的位置)。我的目标是有一些其他功能可以将任何Nat
转换为Mod n
值,例如,15 : Nat
映射到3 : Mod 4
。我的Mod
类型目前只有一个构造函数mkMod : Fin n -> Mod n
。
答案 0 :(得分:1)
在了解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
,并将其全部检出。
现在唯一的问题是Idris似乎无法自动找到LT
证明。这就是:
λΠ> the (Fin 6) (natToFin 2)
When elaborating argument p to function mod2.natToFin:
Can't solve goal
LT (fromInteger 2) (fromInteger 6)
有没有办法解决这个问题?