107 lines
3.4 KiB
Plaintext
Raw Normal View History

2026-04-14 19:55:28 +01:00
%% 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