107 lines
3.4 KiB
Plaintext
107 lines
3.4 KiB
Plaintext
|
|
%% mult.elf - Multiplication on Natural Numbers
|
||
|
|
%%
|
||
|
|
%% Multiplication is defined recursively:
|
||
|
|
%% 0 * N = 0
|
||
|
|
%% (S M) * N = N + (M * N)
|
||
|
|
|
||
|
|
mult : nat -> nat -> nat -> type.
|
||
|
|
%mode mult +M +N -R.
|
||
|
|
|
||
|
|
mult/z : mult z N z.
|
||
|
|
mult/s : mult (s M) N R
|
||
|
|
<- mult M N P
|
||
|
|
<- add N P R.
|
||
|
|
|
||
|
|
%% Multiplication is total
|
||
|
|
mult-total : {M:nat} {N:nat} mult M N P -> type.
|
||
|
|
%mode mult-total +M +N -D.
|
||
|
|
|
||
|
|
mult-total/z : mult-total z N mult/z.
|
||
|
|
mult-total/s : mult-total (s M) N (mult/s Dadd Dmult)
|
||
|
|
<- mult-total M N Dmult
|
||
|
|
<- add-total N _ Dadd.
|
||
|
|
|
||
|
|
%worlds () (mult-total _ _ _).
|
||
|
|
%total M (mult-total M _ _).
|
||
|
|
|
||
|
|
%% ============================================================
|
||
|
|
%% BASIC MULTIPLICATION LEMMAS
|
||
|
|
%% ============================================================
|
||
|
|
|
||
|
|
%% Right zero: N * 0 = 0
|
||
|
|
mult-right-z : {N:nat} mult N z z -> type.
|
||
|
|
%mode mult-right-z +N -D.
|
||
|
|
|
||
|
|
mult-right-z/z : mult-right-z z mult/z.
|
||
|
|
mult-right-z/s : mult-right-z (s N) (mult/s add/z D)
|
||
|
|
<- mult-right-z N D.
|
||
|
|
|
||
|
|
%worlds () (mult-right-z _ _).
|
||
|
|
%total N (mult-right-z N _).
|
||
|
|
|
||
|
|
%% Left identity: 1 * N = N
|
||
|
|
mult-left-one : {N:nat} mult (s z) N N -> type.
|
||
|
|
%mode mult-left-one +N -D.
|
||
|
|
|
||
|
|
mult-left-one/base : mult-left-one N (mult/s Dadd mult/z)
|
||
|
|
<- add-right-z N Dadd.
|
||
|
|
|
||
|
|
%worlds () (mult-left-one _ _).
|
||
|
|
%total {} (mult-left-one _ _).
|
||
|
|
|
||
|
|
%% Right identity: N * 1 = N
|
||
|
|
mult-right-one : {N:nat} mult N (s z) N -> type.
|
||
|
|
%mode mult-right-one +N -D.
|
||
|
|
|
||
|
|
mult-right-one/z : mult-right-one z mult/z.
|
||
|
|
mult-right-one/s : mult-right-one (s N) (mult/s (add/s add/z) D)
|
||
|
|
<- mult-right-one N D.
|
||
|
|
|
||
|
|
%worlds () (mult-right-one _ _).
|
||
|
|
%total N (mult-right-one N _).
|
||
|
|
|
||
|
|
%% ============================================================
|
||
|
|
%% COMMUTATIVITY OF MULTIPLICATION
|
||
|
|
%% ============================================================
|
||
|
|
|
||
|
|
%% Commutativity requires the lemma: M * (S N) = M + M * N
|
||
|
|
%% This is subtle because our definition gives: (S M) * N = N + M * N
|
||
|
|
%%
|
||
|
|
%% The full proof requires careful organization of lemmas involving
|
||
|
|
%% associativity and commutativity of addition. We state the theorem:
|
||
|
|
%%
|
||
|
|
%% mult-comm : mult M N P -> mult N M P -> type.
|
||
|
|
%%
|
||
|
|
%% The proof structure would be:
|
||
|
|
%% 1. Base case: 0 * N = 0 = N * 0 (uses mult-right-z)
|
||
|
|
%% 2. Step case: (S M) * N = N + M*N, and by IH M*N = N*M
|
||
|
|
%% Need N * (S M) = N + N*M = N + M*N (by IH), which matches.
|
||
|
|
%% But N * (S M) by definition requires mult-right-s lemma.
|
||
|
|
%%
|
||
|
|
%% The mult-right-s lemma (M * (S N) = M + M*N) proof requires
|
||
|
|
%% showing that addition commutes/associates appropriately through
|
||
|
|
%% the recursive structure.
|
||
|
|
|
||
|
|
%% For computational verification, we can test specific cases:
|
||
|
|
%% mult 2 3 should equal mult 3 2, both giving 6.
|
||
|
|
|
||
|
|
%% ============================================================
|
||
|
|
%% NOTES ON ADVANCED PROPERTIES
|
||
|
|
%% ============================================================
|
||
|
|
|
||
|
|
%% Associativity: (A * B) * C = A * (B * C)
|
||
|
|
%% Requires: Left distributivity A * (B + C) = A*B + A*C
|
||
|
|
|
||
|
|
%% Left Distributivity: A * (B + C) = A*B + A*C
|
||
|
|
%% Proof by induction on A:
|
||
|
|
%% - Base: 0 * (B + C) = 0 = 0 + 0 = 0*B + 0*C
|
||
|
|
%% - Step: (S A) * (B + C) = (B + C) + A*(B+C)
|
||
|
|
%% By IH: = (B + C) + (A*B + A*C)
|
||
|
|
%% By assoc: = B + (C + A*B) + A*C
|
||
|
|
%% By comm: = B + (A*B + C) + A*C
|
||
|
|
%% By assoc: = (B + A*B) + (C + A*C)
|
||
|
|
%% = (S A)*B + (S A)*C
|
||
|
|
|
||
|
|
%% Right Distributivity: (A + B) * C = A*C + B*C
|
||
|
|
%% Follows from left distributivity and commutativity
|