加载此文件时:
%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奇数。)
答案 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