4. Agda . . .
multS : (m n : N) -> m + m * n == m * S n
multS O _ = eqrefl
multS (S m) n =
eqtrans (eqsuc (plusassoc m n (m * n)))
(eqtrans (eqsuc
(eqplus’ (m + n) (n + m) (m * n) (pluscomm m n)))
(eqtrans (eqsuc (eqsym (plusassoc n m (m * n))))
(eqsuc (eqplus (m + m * n) (m * S n) n (multS m n)))))
5. Agda . . .
multS : (m n : N) -> m + m * n == m * S n
multS O _ = eqrefl
multS (S m) n =
eqtrans (eqsuc (plusassoc m n (m * n)))
(eqtrans (eqsuc
(eqplus’ (m + n) (n + m) (m * n) (pluscomm m n)))
(eqtrans (eqsuc (eqsym (plusassoc n m (m * n))))
(eqsuc (eqplus (m + m * n) (m * S n) n (multS m n)))))
6. eqtrans : {A : Set} {n m l : A}
-> n == m -> m == l -> n == l
Algebraic Reasoning !
7. multS (S m) n =
proof
S m + S m * n
==[ eqrefl ]
S (m + n + m * n)
==[ eqsuc (plusassoc m n (m * n)) ]
S ((m + n) + m * n)
==[ eqsuc (eqplus’ (m + n) (n + m) (m * n)
(pluscomm m n)) ]
S ((n + m) + m * n)
==[ eqsuc (eqsym (plusassoc n m (m * n))) ]
S (n + m + m * n)
==[ eqsuc (eqplus (m + m * n) (m * S n) n
(multS m n)) ]
S (n + m * S n)
==[ eqrefl ]
S m * S n
qed
9. data _IsEqualTo_ A : Set (x y : A) : Set1 where
relTo : (x=y : x == y) -> x IsEqualTo y
proof_ : forall A : Set x y : A
-> x IsEqualTo y -> x == y
proof relTo x=y = x=y
_==[_]_ : forall A : Set y z : A -> (x : A)
-> x == y -> y IsEqualTo z -> x IsEqualTo z
_ ==[ x=y ] relTo y=z = relTo (eqtrans x=y y=z)
_qed : forall A : Set -> (x : A) -> x IsEqualTo x
_qed _ = relTo eqrefl
proof_ < _qed = _==[_]_