Yasutaka Higa
data Int : Set where
O : Int
S : Int -> Int
x と y の乗算 : x にかかっている S の分だけ y を 0 に加算する
infixl 30 _+_
_+_ : Int -> Int -> Int
x + O = x
x + (S y) = S (x + y)
func : A -> (A -> B) -> B
infixl 30 _+_
_+_ : Int -> Int -> Int
x + O = x
x + (S y) = S (x + y)
加法の結合法則 : (x + y) + z = x + (y + z) <- 目標ライン
data _≡_ {A : Set} : A -> A -> Set where
refl : {x : A} -> x == x
等しさを保ったまま変換する関数を作ると良い
trans : {A : Set} {x y z : A} -> x ≡ y -> y ≡ z -> x ≡ z
add-sym : (x y : Int) -> x + y ≡ y + x
add-sym O O = refl
add-sym O (S y) = cong S (add-sym O y)
add-sym (S x) O = cong S (add-sym x O)
add-sym (S x) (S y) = ?
等しさを保ったまま式を変形していくことが必要になります
begin
変換前の式
≡⟨ 変換する関数 ⟩
変換後の式
∎
add-sym (S x) (S y) = begin
(S x) + (S y)
≡⟨ ? ⟩
(S y) + (S x)
∎
add-sym (S x) (S y) = begin
(S x) + (S y)
≡⟨ refl ⟩
S (S x + y)
≡⟨ ? ⟩
(S y) + (S x)
∎
S ((S x) + y)
≡⟨ cong S (add-sym (S x) y) ⟩
S ((y + (S x)))
left-increment : (x y : Int) -> (S x) + y ≡ S (x + y)
left-increment x y = ?
...
S ((S x) + y)
≡⟨ sym (left-increment x (S y)) ⟩
(S y) + (S x)
∎
add-sym (S x) (S y) = begin
(S x) + (S y)
≡⟨ refl ⟩
S ((S x) + y)
≡⟨ cong S (add-sym (S x) y) ⟩
S (y + (S x))
≡⟨ (sym (left-increment y (S x))) ⟩
(S y) + (S x)
∎
infixl 40 _*_
_*_ : Int -> Int -> Int
n * O = O
n * (S O) = n
n * (S m) = n + (n * m)
mult-sym : (x y : Int) -> x * y ≡ y * x
途中で
(x y : Int) -> (S x) * y ≡ y + (x * y)
が必要になることが分かる