Even or Odd
寫了一段 Agda code,證明一個自然數非奇即偶,並附證明:
data isEven : Nat -> Set where evenPfBase : isEven zero evenPfInd : {n : Nat} -> isEven n -> isEven (suc (suc n)) data isOdd : Nat -> Set where oddPf : {n : Nat} -> isEven n -> isOdd (suc n) mutual even-or-odd : (n : Nat) -> (isEven n) \/ (isOdd n) even-or-odd zero = \/-IL evenPfBase even-or-odd (suc zero) = \/-IR (oddPf evenPfBase) even-or-odd (suc (suc m)) = even-or-odd-ind (even-or-odd m) even-or-odd-ind : {m : Nat} -> (isEven m) \/ (isOdd m) -> (isEven (suc (suc m))) \/ (isOdd (suc (suc m))) even-or-odd-ind (\/-IL evenpf) = \/-IL (evenPfInd evenpf) even-or-odd-ind (\/-IR (oddPf evenpf)) = \/-IR (oddPf (evenPfInd evenpf))
令人不解的是粗體標示部份,我其實想寫成
even-or-odd (suc (suc m)) with (even-or-odd m) ... | \/-IL evenpf = \/-IL (evenPfInd evenpf) ... | \/-IR (oddPf evenpf) = \/-IR (oddPf (evenPfInd evenpf))
這樣就不需要另外寫一個 function even-or-odd-ind
。難道是 with
有先天上的限制嗎?
--
用 Aquamacs + Agda2 mode 後有點寫上癮了 XD。
原來 2 + n/2 + n/2 = (2+n)/2 + (2+n)/2 是這麼難證明的事情 XD。
其實如果只要達成 copy
的功能的話可以不要做除法,慢慢地一個一個插進去就行了 XD。不過看起來解決除法相關的問題更有意思?XD
--
'/' 是整數除法 XD。
Labels: Agda, Programming
<< 回到主頁