证明如此(0 <m) - > (n ** m = S n)

时间:2014-11-15 21:39:18

标签: proof dependent-type idris

我正在尝试使用(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

1 个答案:

答案 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)

有没有办法解决这个问题?