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)
が必要になることが分かる