From e3ff85dccf62b497cd017d2b55e08e7f49ebd80f Mon Sep 17 00:00:00 2001 From: Chantal Keller Date: Wed, 2 Mar 2016 13:16:12 +0100 Subject: Removed old port to Coq 8.4 --- src/versions/standard/Int63/Int63Lib_standard.v | 454 ------------------------ 1 file changed, 454 deletions(-) delete mode 100644 src/versions/standard/Int63/Int63Lib_standard.v (limited to 'src/versions/standard/Int63/Int63Lib_standard.v') diff --git a/src/versions/standard/Int63/Int63Lib_standard.v b/src/versions/standard/Int63/Int63Lib_standard.v deleted file mode 100644 index 9f10adb..0000000 --- a/src/versions/standard/Int63/Int63Lib_standard.v +++ /dev/null @@ -1,454 +0,0 @@ -(************************************************************************) -(* v * The Coq Proof Assistant / The Coq Development Team *) -(* I63 b d0 ... d(N-1) end ] -*) - -Definition sneakr : digits -> int63 -> int63 := Eval compute in - fun b => int63_rect _ (napply_except_last _ _ (size-1) (I63 b)). - -(** [sneakl b x] shifts [x] to the left by one bit. - Leftmost digit is lost while rightmost digit becomes [b]. - Pseudo-code is - [ match x with (I63 d0 ... dN) => I63 d1 ... dN b end ] -*) - -Definition sneakl : digits -> int63 -> int63 := Eval compute in - fun b => int63_rect _ (fun _ => napply_then_last _ _ b (size-1) I63). - - -(** [shiftl], [shiftr], [twice] and [twice_plus_one] are direct - consequences of [sneakl] and [sneakr]. *) - -Definition shiftl := sneakl D0. -Definition shiftr := sneakr D0. -Definition twice := sneakl D0. -Definition twice_plus_one := sneakl D1. - -(** [firstl x] returns the leftmost digit of number [x]. - Pseudo-code is [ match x with (I63 d0 ... dN) => d0 end ] *) - -Definition firstl : int63 -> digits := Eval compute in - int63_rect _ (fun d => napply_discard _ _ d (size-1)). - -(** [firstr x] returns the rightmost digit of number [x]. - Pseudo-code is [ match x with (I63 d0 ... dN) => dN end ] *) - -Definition firstr : int63 -> digits := Eval compute in - int63_rect _ (napply_discard _ _ (fun d=>d) (size-1)). - -(** [iszero x] is true iff [x = I63 D0 ... D0]. Pseudo-code is - [ match x with (I63 D0 ... D0) => true | _ => false end ] *) - -Definition iszero : int63 -> bool := Eval compute in - let f d b := match d with D0 => b | D1 => false end - in int63_rect _ (nfold_bis _ _ f true size). - -(* NB: DO NOT transform the above match in a nicer (if then else). - It seems to work, but later "unfold iszero" takes forever. *) - - -(** [base] is [2^63], obtained via iterations of [Z.double]. - It can also be seen as the smallest b > 0 s.t. phi_inv b = 0 - (see below) *) - -Definition base := Eval compute in - iter_nat size Z Z.double 1%Z. - -(** * Recursors *) - -Fixpoint recl_aux (n:nat)(A:Type)(case0:A)(caserec:digits->int63->A->A) - (i:int63) : A := - match n with - | O => case0 - | S next => - if iszero i then - case0 - else - let si := shiftl i in - caserec (firstl i) si (recl_aux next A case0 caserec si) - end. - -Fixpoint recr_aux (n:nat)(A:Type)(case0:A)(caserec:digits->int63->A->A) - (i:int63) : A := - match n with - | O => case0 - | S next => - if iszero i then - case0 - else - let si := shiftr i in - caserec (firstr i) si (recr_aux next A case0 caserec si) - end. - -Definition recl := recl_aux size. -Definition recr := recr_aux size. - -(** * Conversions *) - -(** From int63 to Z, we simply iterates [Z.double] or [Z.succ_double]. *) - -Definition phi : int63 -> Z := - recr Z (0%Z) - (fun b _ => match b with D0 => Z.double | D1 => Z.succ_double end). - -(** From positive to int63. An abstract definition could be : - [ phi_inv (2n) = 2*(phi_inv n) /\ - phi_inv 2n+1 = 2*(phi_inv n) + 1 ] *) - -Fixpoint phi_inv_positive p := - match p with - | xI q => twice_plus_one (phi_inv_positive q) - | xO q => twice (phi_inv_positive q) - | xH => In - end. - -(** The negative part : 2-complement *) - -Fixpoint complement_negative p := - match p with - | xI q => twice (complement_negative q) - | xO q => twice_plus_one (complement_negative q) - | xH => twice Tn - end. - -(** A simple incrementation function *) - -Definition incr : int63 -> int63 := - recr int63 In - (fun b si rec => match b with - | D0 => sneakl D1 si - | D1 => sneakl D0 rec end). - -(** We can now define the conversion from Z to int63. *) - -Definition phi_inv : Z -> int63 := fun n => - match n with - | Z0 => On - | Zpos p => phi_inv_positive p - | Zneg p => incr (complement_negative p) - end. - -(** [phi_inv2] is similar to [phi_inv] but returns a double word - [zn2z int63] *) - -Definition phi_inv2 n := - match n with - | Z0 => W0 - | _ => WW (phi_inv (n/base)%Z) (phi_inv n) - end. - -(** [phi2] is similar to [phi] but takes a double word (two args) *) - -Definition phi2 nh nl := - ((phi nh)*base+(phi nl))%Z. - -(** * Addition *) - -(** Addition modulo [2^63] *) - -Definition add63 (n m : int63) := phi_inv ((phi n)+(phi m)). -Notation "n + m" := (add63 n m) : int63_scope. - -(** Addition with carry (the result is thus exact) *) - -(* spiwack : when executed in non-compiled*) -(* mode, (phi n)+(phi m) is computed twice*) -(* it may be considered to optimize it *) - -Definition add63c (n m : int63) := - let npm := n+m in - match (phi npm ?= (phi n)+(phi m))%Z with - | Eq => C0 npm - | _ => C1 npm - end. -Notation "n '+c' m" := (add63c n m) (at level 50, no associativity) : int63_scope. - -(** Addition plus one with carry (the result is thus exact) *) - -Definition add63carryc (n m : int63) := - let npmpone_exact := ((phi n)+(phi m)+1)%Z in - let npmpone := phi_inv npmpone_exact in - match (phi npmpone ?= npmpone_exact)%Z with - | Eq => C0 npmpone - | _ => C1 npmpone - end. - -(** * Substraction *) - -(** Subtraction modulo [2^63] *) - -Definition sub63 (n m : int63) := phi_inv ((phi n)-(phi m)). -Notation "n - m" := (sub63 n m) : int63_scope. - -(** Subtraction with carry (thus exact) *) - -Definition sub63c (n m : int63) := - let nmm := n-m in - match (phi nmm ?= (phi n)-(phi m))%Z with - | Eq => C0 nmm - | _ => C1 nmm - end. -Notation "n '-c' m" := (sub63c n m) (at level 50, no associativity) : int63_scope. - -(** subtraction minus one with carry (thus exact) *) - -Definition sub63carryc (n m : int63) := - let nmmmone_exact := ((phi n)-(phi m)-1)%Z in - let nmmmone := phi_inv nmmmone_exact in - match (phi nmmmone ?= nmmmone_exact)%Z with - | Eq => C0 nmmmone - | _ => C1 nmmmone - end. - -(** Opposite *) - -Definition opp63 x := On - x. -Notation "- x" := (opp63 x) : int63_scope. - -(** Multiplication *) - -(** multiplication modulo [2^63] *) - -Definition mul63 (n m : int63) := phi_inv ((phi n)*(phi m)). -Notation "n * m" := (mul63 n m) : int63_scope. - -(** multiplication with double word result (thus exact) *) - -Definition mul63c (n m : int63) := phi_inv2 ((phi n)*(phi m)). -Notation "n '*c' m" := (mul63c n m) (at level 40, no associativity) : int63_scope. - - -(** * Division *) - -(** Division of a double size word modulo [2^63] *) - -Definition div6321 (nh nl m : int63) := - let (q,r) := Z.div_eucl (phi2 nh nl) (phi m) in - (phi_inv q, phi_inv r). - -(** Division modulo [2^63] *) - -Definition div63 (n m : int63) := - let (q,r) := Z.div_eucl (phi n) (phi m) in - (phi_inv q, phi_inv r). -Notation "n / m" := (div63 n m) : int63_scope. - - -(** * Unsigned comparison *) - -Definition compare63 (n m : int63) := ((phi n)?=(phi m))%Z. -Notation "n ?= m" := (compare63 n m) (at level 70, no associativity) : int63_scope. - -Definition eqb63 (n m : int63) := - match n ?= m with Eq => true | _ => false end. - - -(** Computing the [i]-th iterate of a function: - [iter_int63 i A f = f^i] *) - -Definition iter_int63 i A f := - recr (A->A) (fun x => x) - (fun b si rec => match b with - | D0 => fun x => rec (rec x) - | D1 => fun x => f (rec (rec x)) - end) - i. - -(** Combining the [(63-p)] low bits of [i] above the [p] high bits of [j]: - [addmuldiv63 p i j = i*2^p+j/2^(63-p)] (modulo [2^63]) *) - -Definition addmuldiv63 p i j := - let (res, _ ) := - iter_int63 p (int63*int63) - (fun ij => let (i,j) := ij in (sneakl (firstl j) i, shiftl j)) - (i,j) - in - res. - - -Fixpoint euler (guard:nat) (i j:int63) {struct guard} := - match guard with - | O => In - | S p => match j ?= On with - | Eq => i - | _ => euler p j (let (_, r ) := i/j in r) - end - end. - -Definition gcd63 (i j:int63) := euler (2*size)%nat i j. - -(** Square root functions using newton iteration - we use a very naive upper-bound on the iteration - 2^63 instead of the usual 63. -**) - - - -Definition sqrt63_step (rec: int63 -> int63 -> int63) (i j: int63) := -Eval lazy delta [Twon] in - let (quo,_) := i/j in - match quo ?= j with - Lt => rec i (fst ((j + quo)/Twon)) - | _ => j - end. - -Fixpoint iter63_sqrt (n: nat) (rec: int63 -> int63 -> int63) - (i j: int63) {struct n} : int63 := - sqrt63_step - (match n with - O => rec - | S n => (iter63_sqrt n (iter63_sqrt n rec)) - end) i j. - -Definition sqrt63 i := -Eval lazy delta [On In Twon] in - match compare63 In i with - Gt => On - | Eq => In - | Lt => iter63_sqrt 63 (fun i j => j) i (fst (i/Twon)) - end. - -Definition v30 := Eval compute in (addmuldiv63 (phi_inv (Z.of_nat size - 1)) In On). - -Definition sqrt632_step (rec: int63 -> int63 -> int63 -> int63) - (ih il j: int63) := -Eval lazy delta [Twon v30] in - match ih ?= j with Eq => j | Gt => j | _ => - let (quo,_) := div6321 ih il j in - match quo ?= j with - Lt => let m := match j +c quo with - C0 m1 => fst (m1/Twon) - | C1 m1 => fst (m1/Twon) + v30 - end in rec ih il m - | _ => j - end end. - -Fixpoint iter632_sqrt (n: nat) - (rec: int63 -> int63 -> int63 -> int63) - (ih il j: int63) {struct n} : int63 := - sqrt632_step - (match n with - O => rec - | S n => (iter632_sqrt n (iter632_sqrt n rec)) - end) ih il j. - -Definition sqrt632 ih il := -Eval lazy delta [On In] in - let s := iter632_sqrt 63 (fun ih il j => j) ih il Tn in - match s *c s with - W0 => (On, C0 On) (* impossible *) - | WW ih1 il1 => - match il -c il1 with - C0 il2 => - match ih ?= ih1 with - Gt => (s, C1 il2) - | _ => (s, C0 il2) - end - | C1 il2 => - match (ih - In) ?= ih1 with (* we could parametrize ih - 1 *) - Gt => (s, C1 il2) - | _ => (s, C0 il2) - end - end - end. - - -Fixpoint p2i n p : (N*int63)%type := - match n with - | O => (Npos p, On) - | S n => match p with - | xO p => let (r,i) := p2i n p in (r, Twon*i) - | xI p => let (r,i) := p2i n p in (r, Twon*i+In) - | xH => (N0, In) - end - end. - -Definition positive_to_int63 (p:positive) := p2i size p. - -(** Constant 63 converted into type int63. - It is used as default answer for numbers of zeros - in [head0] and [tail0] *) - -Definition T63 : int63 := Eval compute in phi_inv (Z.of_nat size). - -Definition head063 (i:int63) := - recl _ (fun _ => T63) - (fun b si rec n => match b with - | D0 => rec (add63 n In) - | D1 => n - end) - i On. - -Definition tail063 (i:int63) := - recr _ (fun _ => T63) - (fun b si rec n => match b with - | D0 => rec (add63 n In) - | D1 => n - end) - i On. -- cgit