? ; dans la trace qui suit, les entrées de l’utilisateur sont
données en rouge
? ; d'abord démontrons l’associativité de append, ou append est
définie comme :
? ; (de app (x y)(if (null x) y (cons
(car x) (app (cdr x) y))))
?
? (theo (app X (app Y Z)) = (app (app X Y) Z))
** 0 prove (app X (app Y Z)) = (app
(app X Y) Z)
** reduit a (app X (app Y Z)) = (app
(app X Y) Z)
command ?
(induct list X)
** base
** 1 prove (app nil (app Y Z)) = (app
(app nil Y) Z)
** reduit a (app Y Z) = (app Y Z)
** 1 proved
** step
** 1 prove (app (cons g001 X) (app Y
Z)) = (app (app (cons g001 X) Y) Z)
** reduit a (cons g001 (app X (app Y
Z))) = (cons g001 (app (app X Y) Z))
** 2 prove (cons g001 (app X (app Y
Z))) = (cons g001 (app (app X Y) Z))
** reduit a (cons g001 (app X (app Y
Z))) = (cons g001 (app (app X Y) Z))
command ?
(indhyp 1
<-)
** 3 prove (cons g001 (app X (app Y
Z))) = (cons g001 (app X (app Y Z)))
** reduit a (cons g001 (app X (app Y
Z))) = (cons g001 (app X (app Y Z)))
** 3 proved
** 2 proved
** 1 proved
** 0 proved
? ; ensuite avec la fonction reverse (rev) définie
comme :
? ; (de rev (x) (if (null x) nil (app
(rev (cdr x)) (cons (car x) nil))))
? ; démontrons que :
? (theo (app (rev A) (rev B)) = (rev (app B
A)))
** 0 prove (app (rev A) (rev B)) = (rev
(app B A))
** reduit a (app (rev A) (rev B)) =
(rev (app B A))
command ?
(induct list B)
** base
** 1 prove (app (rev A) (rev nil)) =
(rev (app nil A))
** reduit a (app (rev A) nil) = (rev A)
** 2 prove (app (rev A) nil) = (rev A)
** reduit a (app (rev A) nil) = (rev A)
command ?
(gen C (rev A))
** 3 prove (app C nil) = C
** reduit a (app C nil) = C
command ?
(induct list C)
** base
** 4 prove (app nil nil) = nil
** reduit a nil = nil
** 4 proved
** step
** 4 prove (app (cons g002 C) nil) =
(cons g002 C)
** reduit a (cons g002 (app C nil)) =
(cons g002 C)
** 5 prove (cons g002 (app C nil)) =
(cons g002 C)
** reduit a (cons g002 (app C nil)) =
(cons g002 C)
command ?
(indhyp 1
->)
** 6 prove (cons g002 C) = (cons g002
C)
** reduit a (cons g002 C) = (cons g002
C)
** 6 proved
** 5 proved
** 4 proved
** 3 proved
** 2 proved
** 1 proved
** step
** 1 prove (app (rev A) (rev (cons g003
B))) = (rev (app (cons g003 B) A))
** reduit a (app (rev A) (app (rev B)
(cons g003 nil))) = (app (rev (app B A)) (cons g003 nil))
** 2 prove (app (rev A) (app (rev B)
(cons g003 nil))) = (app (rev (app B A)) (cons g003 nil))
** reduit a (app (rev A) (app (rev B)
(cons g003 nil))) = (app (rev (app B A)) (cons g003 nil))
command ?
(indhyp 1
<-)
** 3 prove (app (rev A) (app (rev B)
(cons g003 nil))) = (app (app (rev A) (rev B)) (cons g003 nil))
** reduit a (app (rev A) (app (rev B)
(cons g003 nil))) = (app (app (rev A) (rev B)) (cons g003 nil))
command ?
(gen X (rev A) Y (rev B) Z (cons g003 nil))
** 4 prove (app X (app Y Z)) = (app
(app X Y) Z)
** reduit a (app X (app Y Z)) = (app
(app X Y) Z) ;;; c'est le théorème sur
l'associativité de append juste démontré!!
command ?
(induct list X)
** base
** 5 prove (app nil (app Y Z)) = (app
(app nil Y) Z)
** reduit a (app Y Z) = (app Y Z)
** 5 proved
** step
** 5 prove (app (cons g004 X) (app Y
Z)) = (app (app (cons g004 X) Y) Z)
** reduit a (cons g004 (app X (app Y
Z))) = (cons g004 (app (app X Y) Z))
** 6 prove (cons g004 (app X (app Y
Z))) = (cons g004 (app (app X Y) Z))
** reduit a (cons g004 (app X (app Y
Z))) = (cons g004 (app (app X Y) Z))
command ?
(indhyp 1
<-)
** 7 prove (cons g004 (app X (app Y
Z))) = (cons g004 (app X (app Y Z)))
** reduit a (cons g004 (app X (app Y
Z))) = (cons g004 (app X (app Y Z)))
** 7 proved
** 6 proved
** 5 proved
** 4 proved
** 3 proved
** 2 proved
** 1 proved
** 0 proved
? ; finalement, avec l'addition définie comme :
? ; (de p (x y) (if (zerop x) y (1+ (p
(1- x) y))))
? ; démontrons la commutativité de l'addition
? (theo (p x y) = (p y x))
** 0 prove (p x y) = (p y x)
** reduit a (p x y) = (p y x)
command ?
(induct num x)
** base
** 1 prove (p 0 y) = (p y 0)
** reduit a y = (p y 0)
** 2 prove y = (p y 0)
** reduit a y = (p y 0)
command ?
(induct num y)
** base
** 3 prove 0 = (p 0 0)
** reduit a 0 = 0
** 3 proved
** step
** 3 prove (1+ y) = (p (1+ y) 0)
** reduit a (1+ y) = (1+ (p y 0))
** 4 prove (1+ y) = (1+ (p y 0))
** reduit a (1+ y) = (1+ (p y 0))
command ?
(indhyp 1
<-)
** 5 prove (1+ y) = (1+ y)
** reduit a (1+ y) = (1+ y)
** 5 proved
** 4 proved
** 3 proved
** 2 proved
** 1 proved
** step
** 1 prove (p (1+ x) y) = (p y (1+ x))
** reduit a (1+ (p x y)) = (p y (1+ x))
** 2 prove (1+ (p x y)) = (p y (1+ x))
** reduit a (1+ (p x y)) = (p y (1+ x))
command ?
(indhyp 1
->)
** 3 prove (1+ (p y x)) = (p y (1+ x))
** reduit a (1+ (p y x)) = (p y (1+ x))
command ?
(induct num y)
** base
** 4 prove (1+ (p 0 x)) = (p 0 (1+ x))
** reduit a (1+ x) = (1+ x)
** 4 proved
** step
** 4 prove (1+ (p (1+ y) x)) = (p (1+
y) (1+ x))
** reduit a (1+ (1+ (p y x))) = (1+ (p
y (1+ x)))
** 5 prove (1+ (1+ (p y x))) = (1+ (p y
(1+ x)))
** reduit a (1+ (1+ (p y x))) = (1+ (p
y (1+ x)))
command ?
(indhyp
1 <-)
** 6 prove (1+ (1+ (p y x))) = (1+ (1+
(p y x)))
** reduit a (1+ (1+ (p y x))) = (1+ (1+
(p y x)))
** 6 proved
** 5 proved
** 4 proved
** 3 proved
** 2 proved
** 1 proved
** 0 proved