Chain Reasoning
我會用了!整個 ChainReasoning module 的精神是簡化 transitivity 的使用(透過 operator ===)並要求中間項適時地出現(由 operator by 達成)。之前證得超複雜的 lemma 現在變成
lemma : {n₁ n₂ n₃ : Nat} ->
suc (parity p + (n₁ + n₂) + n₃) ≡ parity p + n₁ + suc (n₂ + n₃)
lemma {n₁} {n₂} {n₃} =
chain> suc (parity p + (n₁ + n₂) + n₃)
=== suc (parity p + (n₁ + n₂ + n₃))
by cong suc (sym (+assoc (parity p) (n₁ + n₂) n₃))
=== parity p + suc (n₁ + n₂ + n₃)
by sym (+suc (parity p) (n₁ + n₂ + n₃))
=== parity p + (n₁ + suc (n₂ + n₃)) by cong (\x -> parity p + x)
( chain> suc (n₁ + n₂ + n₃)
=== suc (n₁ + (n₂ + n₃)) by cong suc (sym (+assoc n₁ n₂ n₃))
=== n₁ + suc (n₂ + n₃) by sym (+suc n₁ (n₂ + n₃)) )
=== parity p + n₁ + suc (n₂ + n₃)
by +assoc (parity p) n₁ (suc (n₂ + n₃))
因為 intermediate expressions 出現得夠多,就不會一堆 proof terms 疊在一起看起來很嚇人,應該有好看一點 XD。
然後我試著要把 by 的引數順序反過來,就可以變成 scm 老師心目中理想的長相:
chain> suc (parity p + (n₁ + n₂) + n₃)
=== [ cong suc (sym (+assoc (parity p) (n₁ + n₂) n₃)) ]
suc (parity p + (n₁ + n₂ + n₃))
=== ...
可惜試到最後還是弄不出來,而且做到覺得不可能成功,所以就放棄了 XD。最後的版本是
data Indeed {A : Set} : A -> Set where
indeed : (x : A) -> Indeed x
[_ : {A : Set}{x y : A} -> x == y -> Indeed y -> x == y
[ eq = \_ -> eq
]_ : {A : Set} -> (y : A) -> Indeed y
] y = indeed y
如果加幾組括號進去是會 work,但如果加括號整個形式就爛掉了 XD。
--
從明天開始暫時不能玩 Agda 了 XD。
會用 chain reasoning(而且證過上面那個 lemma)之後,scm 老師出的第一個作業就變得 trivial 了 XD。
half : (n : Nat) -> (Nat ⋮ \m -> n ≡ m + m) \/
(Nat ⋮ \m -> n ≡ 1 + (m + m))
...
half (suc n) | \/-IR (sub m p) = \/-IL (sub (1 + m) (proof n m p))
where
proof : (n : Nat) -> (m : Nat) ->
(n ≡ 1 + (m + m)) -> (1 + n ≡ (1 + m) + (1 + m))
proof n m p =
chain> 1 + n
=== 1 + (1 + m + m) by cong suc p
=== (1 + m) + (1 + m) by sym (+suc (1 + m) m)
--
第一個想到可以這樣搞證明的人真的很神!XD
Labels: Agda, Programming


<< 回到主頁