
valid 0
unknown "Error: \\(.*\\)$" "\\1"
fail "Syntax error: \\(.*\\)$" "\\1"
time "why3cpulimit time : %s s"

transformation "eliminate_non_struct_recursion"
transformation "eliminate_if"
transformation "eliminate_literal"
transformation "eliminate_non_lambda_set_epsilon"

transformation "eliminate_projections"

transformation "simplify_formula"
(*transformation "simplify_trivial_quantification_in_goal"*)

theory BuiltIn

  prelude "Require Import BuiltIn."

  syntax type int "Numbers.BinNums.Z"
  syntax type real "Reals.Rdefinitions.R"
  syntax predicate  (=)   "(%1 = %2)"
end


theory Unit
  syntax type unit "Init.Datatypes.unit"
end

theory Bool

  syntax type bool "Init.Datatypes.bool"

  syntax function True  "Init.Datatypes.true"
  syntax function False "Init.Datatypes.false"
end

theory bool.Bool

  syntax function andb  "Init.Datatypes.andb"
  syntax function orb   "Init.Datatypes.orb"
  syntax function xorb  "Init.Datatypes.xorb"
  syntax function notb  "Init.Datatypes.negb"
  syntax function implb "Init.Datatypes.implb"

end


theory int.Int

  syntax function zero "0%Z"
  syntax function one  "1%Z"

  syntax function (+)  "(%1 + %2)%Z"
  syntax function (-)  "(%1 - %2)%Z"
  syntax function (*)  "(%1 * %2)%Z"
  syntax function (-_) "(-%1)%Z"

  syntax predicate (<=) "(%1 <= %2)%Z"
  syntax predicate (<)  "(%1 < %2)%Z"
  syntax predicate (>=) "(%1 >= %2)%Z"
  syntax predicate (>)  "(%1 > %2)%Z"

  remove prop MulComm.Comm
  remove prop MulAssoc.Assoc
  remove prop Unit_def_l
  remove prop Unit_def_r
  remove prop Inv_def_l
  remove prop Inv_def_r
  remove prop Assoc
  remove prop Mul_distr_l
  remove prop Mul_distr_r
  remove prop Comm
  remove prop Unitary
  remove prop Refl
  remove prop Trans
  remove prop Antisymm
  remove prop Total
  remove prop NonTrivialRing
  remove prop CompatOrderAdd
  remove prop CompatOrderMult
  remove prop ZeroLessOne

end

theory int.Abs

  syntax function abs "ZArith.BinInt.Z.abs"

  remove prop Abs_pos

end

theory int.MinMax

  syntax function min "ZArith.BinInt.Z.min"
  syntax function max "ZArith.BinInt.Z.max"

end

(* removed: Coq Zdiv is NOT true Euclidean division:
   Zmod can be negative, in fact (Zmod x y) has the same sign as y,
   which is not the usual convention of programming language either.

theory int.EuclideanDivision

  syntax function div "ZArith.BinInt.Z.div"
  syntax function mod "ZArith.BinInt.Z.modulo"

  remove prop Div_mod
  remove prop Div_bound
  remove prop Mod_bound
  remove prop Mod_1
  remove prop Div_1

end
*)

theory int.ComputerDivision

  (* Coq provides the division and modulo operators
     with the same convention as mainstream programming language
     such C, Java, OCaml *)

  syntax function div "ZArith.BinInt.Z.quot"
  syntax function mod "ZArith.BinInt.Z.rem"

  remove prop Div_mod
  remove prop Div_bound
  remove prop Mod_bound
  remove prop Div_sign_pos
  remove prop Div_sign_neg
  remove prop Mod_sign_pos
  remove prop Mod_sign_neg
  remove prop Rounds_toward_zero
  remove prop Div_1
  remove prop Mod_1
  remove prop Div_inf
  remove prop Mod_inf
  remove prop Div_mult
  remove prop Mod_mult

end


theory real.Real

  syntax function zero "0%R"
  syntax function one  "1%R"

  syntax function (+)  "(%1 + %2)%R"
  syntax function (-)  "(%1 - %2)%R"
  syntax function (-_) "(-%1)%R"
  syntax function (*)  "(%1 * %2)%R"
  syntax function (/)  "(%1 / %2)%R"
  syntax function inv  "(/ %1)%R"

  syntax predicate (<=) "(%1 <= %2)%R"
  syntax predicate (<)  "(%1 < %2)%R"
  syntax predicate (>=) "(%1 >= %2)%R"
  syntax predicate (>)  "(%1 > %2)%R"

  remove prop MulComm.Comm
  remove prop MulAssoc.Assoc
  remove prop Unit_def_l
  remove prop Unit_def_r
  remove prop Inv_def_l
  remove prop Inv_def_r
  remove prop Assoc
  remove prop Mul_distr_l
  remove prop Mul_distr_r
  remove prop Comm
  remove prop Unitary
  remove prop Inverse
  remove prop NonTrivialRing
  remove prop CompatOrderAdd
  remove prop CompatOrderMult
  remove prop ZeroLessOne
  remove prop Refl
  remove prop Trans
  remove prop Antisymm
  remove prop Total
  remove prop assoc_mul_div
  remove prop assoc_div_mul
  remove prop assoc_div_div

end

theory real.RealInfix

  syntax function (+.)  "(%1 + %2)%R"
  syntax function (-.)  "(%1 - %2)%R"
  syntax function (-._) "(-%1)%R"
  syntax function ( *.) "(%1 * %2)%R"
  syntax function (/.)  "(%1 / %2)%R"

  syntax predicate (<=.) "(%1 <= %2)%R"
  syntax predicate (<.)  "(%1 <  %2)%R"
  syntax predicate (>=.) "(%1 >= %2)%R"
  syntax predicate (>.)  "(%1 >  %2)%R"

end

theory real.Abs

  prelude "Require Reals.Rbasic_fun."

  syntax function abs "Reals.Rbasic_fun.Rabs"

  remove prop Abs_le
  remove prop Abs_pos

end

theory real.MinMax

  syntax function min "Reals.Rbasic_fun.Rmin"
  syntax function max "Reals.Rbasic_fun.Rmax"

end

theory real.FromInt

  syntax function from_int "BuiltIn.IZR"

  remove prop Zero
  remove prop One
  remove prop Add
  remove prop Sub
  remove prop Mul
  remove prop Neg

end

theory real.Square

  prelude "Require Reals.R_sqrt."

  syntax function sqr  "Reals.RIneq.Rsqr"
  syntax function sqrt "Reals.R_sqrt.sqrt"  (* and not Rsqrt *)

  remove prop Sqrt_positive
  remove prop Sqrt_square
  remove prop Square_sqrt

end

theory real.ExpLog

  prelude "Require Reals.Rtrigo_def."
  prelude "Require Reals.Rpower."

  syntax function exp "Reals.Rtrigo_def.exp"
  syntax function log "Reals.Rpower.ln"

  remove prop Exp_zero
  remove prop Exp_sum
  remove prop Log_one
  remove prop Log_mul
  remove prop Log_exp
  remove prop Exp_log

end

theory real.PowerInt

  prelude "Require Reals.Rfunctions."

  syntax function power "Reals.Rfunctions.powerRZ"

  remove prop Power_0 (* already as powerRZ_O *)
  (* remove prop Power_s *)
  remove prop Power_1 (* already as powerRZ_1 *)
  (* remove prop Power_sum *) (* not the same as powerRZ_add *)
  (* remove prop Power_mult *)

end

theory real.PowerReal

  syntax function pow "Reals.Rpower.Rpower"

end

theory real.Trigonometry

  prelude "Require Reals.Rtrigo_def."
  prelude "Require Reals.Rtrigo1."
  prelude "Require Reals.Ratan."

  syntax function cos "Reals.Rtrigo_def.cos"
  syntax function sin "Reals.Rtrigo_def.sin"

  syntax function pi "Reals.Rtrigo1.PI"

  syntax function tan "Reals.Rtrigo1.tan"

  syntax function atan "Reals.Ratan.atan"

  remove prop Pythagorean_identity
  remove prop Cos_le_one
  remove prop Sin_le_one
  remove prop Cos_0
  remove prop Sin_0
  remove prop Cos_pi
  remove prop Sin_pi
  remove prop Cos_pi2
  remove prop Sin_pi2

end

theory list.List

  syntax type list "Init.Datatypes.list"
  syntax function Nil "Init.Datatypes.nil"
  syntax function Cons "Init.Datatypes.cons"

end

theory list.Append

  syntax function (++) "Init.Datatypes.app"

end

theory list.Reverse

  syntax function reverse "Lists.List.rev"

end

theory list.RevAppend

  syntax function rev_append "Lists.List.rev_append"

end

theory list.Combine

  syntax function combine "Lists.List.combine"

end

theory option.Option

  syntax type option "Init.Datatypes.option"
  syntax function None "Init.Datatypes.None"
  syntax function Some "Init.Datatypes.Some"

end

(* this file has an extension .aux rather than .gen since it should not be distributed *)
import "coq-realizations.aux"
