115 lines
3.4 KiB
Plaintext
Raw Permalink Normal View History

2026-04-14 19:55:28 +01:00
%% exp.elf - Exponentiation on Natural Numbers
%%
%% Exponentiation is defined recursively:
%% N^0 = 1
%% N^(S M) = N * N^M
exp : nat -> nat -> nat -> type.
%mode exp +Base +Exponent -Result.
exp/z : exp N z (s z). %% N^0 = 1
exp/s : exp N (s M) R
<- exp N M P %% P = N^M
<- mult N P R. %% R = N * P = N * N^M = N^(M+1)
%% Exponentiation is total
exp-total : {N:nat} {M:nat} exp N M P -> type.
%mode exp-total +N +M -D.
exp-total/z : exp-total N z exp/z.
exp-total/s : exp-total N (s M) (exp/s Dmult Dexp)
<- exp-total N M Dexp
<- mult-total N _ Dmult.
%worlds () (exp-total _ _ _).
%total M (exp-total _ M _).
%% ============================================================
%% BASIC EXPONENTIATION PROPERTIES
%% ============================================================
%% N^1 = N
exp-one : {N:nat} exp N (s z) N -> type.
%mode exp-one +N -D.
exp-one/base : exp-one N (exp/s Dmult exp/z)
<- mult-right-one N Dmult.
%worlds () (exp-one _ _).
%total {} (exp-one _ _).
%% 1^N = 1
exp-base-one : {N:nat} exp (s z) N (s z) -> type.
%mode exp-base-one +N -D.
exp-base-one/z : exp-base-one z exp/z.
exp-base-one/s : exp-base-one (s N) (exp/s Dmult Dexp)
<- exp-base-one N Dexp
<- mult-left-one (s z) Dmult.
%worlds () (exp-base-one _ _).
%total N (exp-base-one N _).
%% 0^(S N) = 0 (0 to any positive power is 0)
exp-base-zero : {N:nat} exp z (s N) z -> type.
%mode exp-base-zero +N -D.
exp-base-zero/z : exp-base-zero z (exp/s mult/z exp/z).
exp-base-zero/s : exp-base-zero (s N) (exp/s mult/z Dexp)
<- exp-base-zero N Dexp.
%worlds () (exp-base-zero _ _).
%total N (exp-base-zero N _).
%% ============================================================
%% EXPONENT LAWS
%% ============================================================
%% Law 1: N^(A+B) = N^A * N^B
%% exp-add : exp N A PA -> exp N B PB -> add A B AB ->
%% mult PA PB PAB -> exp N AB PAB -> type.
%% We'll prove this by induction on B
exp-add : {N:nat} {A:nat} {B:nat} {PA:nat} {PB:nat} {AB:nat} {PAB:nat}
exp N A PA -> exp N B PB -> add A B AB ->
mult PA PB PAB -> exp N AB PAB -> type.
%mode exp-add +N +A +B +PA +PB +AB +PAB +Da +Db +Dadd +Dmult -Dab.
%% Base case: B = 0
%% N^(A+0) = N^A = N^A * 1 = N^A * N^0
exp-add/z : exp-add N A z PA (s z) A PA
Da exp/z Dadd Dmult Da
<- add-right-z A Dadd'
%% Need: Dadd : add A z A
%% Have: Dadd' : add A z A from add-right-z
%% Need: Dmult : mult PA (s z) PA
<- mult-right-one PA Dmult'.
%% The full proof requires showing the inductive step which involves
%% associativity of multiplication. We state it here for completeness.
%% Law 2: (N^A)^B = N^(A*B)
%% This is the power of a power rule
%% Law 3: (M*N)^A = M^A * N^A
%% This is the power of a product rule
%% These proofs follow similar patterns but require the multiplication
%% lemmas we've developed.
%% ============================================================
%% USEFUL COMPUTATIONS
%% ============================================================
%% Let's verify some concrete exponentiations
%% 2^2 = 4
%% 2^3 = 8
%% We can use Twelf's %solve to compute these:
%% %solve D22 : exp two two R.
%% Should give R = four
%% %solve D23 : exp two three R.
%% Should give R = s (s (s (s (s (s (s (s z))))))) = 8