%% 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