https://github.com/EasyCrypt/easycrypt
Revision ba545a9c82d684be976cec846ab5359fabbcd4dd authored by Benjamin Grégoire on 12 June 2018, 05:31:11 UTC, committed by Pierre-Yves Strub on 12 June 2018, 05:34:41 UTC
The tactic statically unroll while loops of the form

  x <- int-constant
  while (guard) {
    body (does not write x);
    x <- f(x);
  }

where "guard" and "f" can be statically evaluated at each
iteration. The code is then replaced by the while loop
fully unrolled.

The tactic does not terminate if the unrolling leads to
a infinite process.
1 parent 43fd7aa
Raw File
Tip revision: ba545a9c82d684be976cec846ab5359fabbcd4dd authored by Benjamin Grégoire on 12 June 2018, 05:31:11 UTC
New tactic for static unrolling of "for-loops"
Tip revision: ba545a9
ecBigIntCore.ml
(* --------------------------------------------------------------------
 * Copyright (c) - 2012--2016 - IMDEA Software Institute
 * Copyright (c) - 2012--2018 - Inria
 * Copyright (c) - 2012--2018 - Ecole Polytechnique
 *
 * Distributed under the terms of the CeCILL-C-V1 license
 * -------------------------------------------------------------------- *)

(* -------------------------------------------------------------------- *)
module type TheInterface = sig
  type zint

  exception Overflow
  exception InvalidString

  val compare : zint -> zint -> int
  val equal   : zint -> zint -> bool
  val sign    : zint -> int
  val hash    : zint -> int

  val le : zint -> zint -> bool
  val lt : zint -> zint -> bool
  val ge : zint -> zint -> bool
  val gt : zint -> zint -> bool

  val zero : zint
  val one  : zint

  val add  : zint -> zint -> zint
  val neg  : zint -> zint
  val sub  : zint -> zint -> zint
  val mul  : zint -> zint -> zint
  val div  : zint -> zint -> zint
  val ediv : zint -> zint -> zint * zint
  val erem : zint -> zint -> zint
  val gcd  : zint -> zint -> zint
  val abs  : zint -> zint
  val pow  : zint ->  int -> zint

  val pred : zint -> zint
  val succ : zint -> zint

  val parity : zint -> [`Even |  `Odd]

  val lshift : zint -> int -> zint
  val rshift : zint -> int -> zint

  val lgand : zint -> zint -> zint
  val lgor  : zint -> zint -> zint
  val lgxor : zint -> zint -> zint

  module Notations : sig
    val ( =^ ) : zint -> zint -> bool
    val ( +^ ) : zint -> zint -> zint
    val ( ~^ ) : zint -> zint
    val ( -^ ) : zint -> zint -> zint
    val ( *^ ) : zint -> zint -> zint
    val ( /^ ) : zint -> zint -> zint

    val ( <=^ ) : zint -> zint -> bool
    val ( <^  ) : zint -> zint -> bool
    val ( >=^ ) : zint -> zint -> bool
    val ( >^  ) : zint -> zint -> bool
  end

  val of_int : int -> zint
  val to_int : zint -> int

  val of_string : string -> zint
  val to_string : zint -> string

  val pp_print : Format.formatter -> zint -> unit
end
back to top