library Basic/ExactFixedPointNumbers
version 0.3
%% authors: M.Roggenbach, T.Mossakowski
%% date: 1.11.99
| op | L:List[Nat] |
| axioms | %[EFPN_Param_Cond1] isModulus(L); |
| %[EFPN_Param_Cond2] ¬ isEmpty(L) |
| m:Nat = #(L); %% number of moduli |
| n:Nat = m+1 %% number of components of an efp-number |
| Index | |-> | IndexModulus, |
| Array[Nat] | |-> | ArrayModulus |
| Index | |-> | IndexEfpn, |
| Array[Nat] | |-> | ArrayEfpn |
| IndexModulus < IndexEfpn; |
| IndexModulus, IndexEfpn < Nat |
| PosEfpn = | { | A: ArrayEfpn . def A!(n as IndexModulus) /\ |
| forall i:IndexModulus . A!i < Modulus!i }; | ||
| Sign = | { | z : Int . z = 1 \/ z = -1 } |
| first |-> sgn, |
| second |-> number |
| Efpn = | { | p: Pair[Sign,PosEfpn] . ¬ |
| (sgn(p)= -1 /\ forall i:IndexEfpn . number(p)!i=0 ) | ||
| } |
| isZero, isPos, isNeg: | Efpn; |
| __ < __ : | Efpn × Efpn; |
| 0, 1 : | Efpn; |
| proj: | IndexEfpn × Efpn -> Nat; |
| sgn: | Efpn -> Sign; %% already declared within Pair |
| make: | IndexEfpn × Nat ->? Efpn; |
| -__: | Efpn -> Efpn; |
| __ + __, __ - __ : | Efpn × Efpn -> Efpn; |
| __ * __: | Int × Efpn -> Efpn; |
| __ * __: | Efpn × Int -> Efpn; |
| efpnToInt: | Efpn -> Int; |
| intToEfpn: | Int -> Efpn; |
| prod: | Nat ->? Int; |
| %% computes PRODi=1k Modulus!(k asIndexModulus) | |
| sum: | Efpn × Nat ->? Int; |
| %% computes SUMi=1k zi * prod(i-1) |
| prod(i)= prod(i-1) * Modulus!(i as IndexModulus) if i>0 |
| intToEfpn(z)=x <=> |
| (( z > 0 => sgn(x)=1 ) /\ |
| (z < 0 => sgn(x)= -1 ) /\ |
| ( number(x)!(n as IndexEfpn) = abs(z) div prod(m) ) /\ |
| ( (forall k:IndexModulus . |
| ( number(x)!k = (abs(z) div prod(k-1)) mod Modulus!k) |
| ))) |
| sum(x,i) = | sum(x,i-1) + |
| (number(x)!(i as IndexEfpn) * prod(i-1)) | |
| if i>0 |
| %[ZeroEfpn_def] 0 = efpnToInt(0); |
| %[OneEfpn_def] 1 = efpnToInt(1) |
| make(i,k)=x <=> | ( sgn(x)=1 /\ forall l:IndexEfpn . |
| ((¬ i=l => proj(i,x)=0) /\ | |
| ( i=l => proj(i,x)=k))) |
| sort Elem |-> Efpn, |
| preds __<__, __>__, __ < __, __ > __ |