Idris:如何使用定义中的“with”块重写/解决?

时间:2017-04-12 09:20:44

标签: idris

加载此文件时:

%default total

data Parity = Even | Odd

opposite: Parity -> Parity
opposite Even = Odd
opposite Odd  = Even

data PNat : Parity -> Type where
     PZ : PNat Even
     PS : PNat p -> PNat $ opposite p

nat2PNat : Nat -> (p ** PNat p)
nat2PNat Z    = (Even ** PZ)
nat2PNat (S x) with (nat2PNat x)
     | (p1 ** px) = (opposite(p1) ** (PS px))

nat2PNat_5 : nat2PNat 5 = (Odd ** PS (PS (PS (PS (PS PZ)))))
nat2PNat_5 = Refl

nat2PNat_S5 : nat2PNat (S 5) = (opposite (fst (nat2PNat 5)) ** (PS (snd (nat2PNat 5))))
nat2PNat_S5 = Refl

nat2PNat_Sn : (n : Nat) -> nat2PNat (S n) = (opposite (fst (nat2PNat n)) ** (PS (snd (nat2PNat n))))
nat2PNat_Sn n = ?rhs

我明白了:

- + Main.rhs [P]
 `--         n : Nat
     ---------------------------------------------------------
      Main.rhs : with block in Main.nat2PNat (nat2PNat n) n =
     (opposite (fst (nat2PNat n)) ** PS (snd (nat2PNat n)))

对我来说,接下来应该做些什么并不明显。

如果我调用“Make Lemma”函数(在Emacs中),结果是无效的Idris,即:

rhs : (n : Nat) -> with block in Main.nat2PNat (nat2PNat n) n = (opposite (fst (nat2PNat n)) ** PS (snd (nat2PNat n)))

n = 5的例子表明,我试图证明的事情似乎是正确的。

(这个例子的动机是我想为偶数和奇数自然数定义依赖类型的类型,即 PNat偶数 PNat奇数。)

1 个答案:

答案 0 :(得分:2)

它非常接近您之前定义的nat2PNat功能。只需在n上进行模式匹配,然后将with (nat2PNat n)添加到非零情况:

nat2PNat_Sn : (n : Nat) -> nat2PNat (S n) = (opposite (fst (nat2PNat n)) ** (PS (snd (nat2PNat n))))
nat2PNat_Sn Z = Refl
nat2PNat_Sn (S n) with (nat2PNat n)
  nat2PNat_Sn (S n) | (p ** pn) = Refl