From df30ac921dc2127ff30dd9c269f43f531997c024 Mon Sep 17 00:00:00 2001
From: Julien Girard <julien.girard2@cea.fr>
Date: Thu, 9 Dec 2021 15:43:21 +0100
Subject: [PATCH] [SAVer] First draft for saver support

---
 README.md                         |   4 +
 config/caisar-detection-data.conf |  10 ++
 config/drivers/saver.drv          | 187 ++++++++++++++++++++++++++++++
 3 files changed, 201 insertions(+)
 create mode 100644 config/drivers/saver.drv

diff --git a/README.md b/README.md
index 1dd0ca03..c88daa77 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,5 @@
 # caisar
+
+## How to add a solver
+Make sure the solver is added to your systems for tests.
+1. Create a `new_solver.drv` in `config/drivers`
diff --git a/config/caisar-detection-data.conf b/config/caisar-detection-data.conf
index 9b73c49d..1dfea43b 100644
--- a/config/caisar-detection-data.conf
+++ b/config/caisar-detection-data.conf
@@ -29,3 +29,13 @@ version_ok  = "1.1"
 command = "%e --model_path %{nnet-onnx} --property_path %f"
 driver = "caisar_drivers/pyrat.drv"
 use_at_auto_level = 1
+
+[ATP saver]
+name = "SAVER"
+exec = "saver"
+version_switch = "--version"
+version_regexp = "PyRAT \\([0-9.]+\\)"
+version_ok  = "1.1"
+command = "%e --model_path %{nnet-onnx} --property_path %f"
+driver = "caisar_drivers/pyrat.drv"
+use_at_auto_level = 1
diff --git a/config/drivers/saver.drv b/config/drivers/saver.drv
new file mode 100644
index 00000000..57ecbb42
--- /dev/null
+++ b/config/drivers/saver.drv
@@ -0,0 +1,187 @@
+(* Why3 drivers for SAVER *)
+
+printer "saver"
+filename "%f-%t-%g.why"
+
+valid "Result = [Tt]rue"
+invalid "Result = [Ff]alse"
+timeout "Result = [Tt]imeout"
+unknown "Result = [Uu]nknown" ""
+
+transformation "inline_trivial"
+transformation "introduce_premises"
+transformation "eliminate_builtin"
+transformation "simplify_formula"
+transformation "native_nn_prover"
+
+theory BuiltIn
+  syntax type int   "int"
+  syntax type real  "real"
+
+  syntax predicate (=)  "(%1 = %2)"
+
+  meta "eliminate_algebraic" "keep_enums"
+  meta "eliminate_algebraic" "keep_recs"
+
+end
+
+theory int.Int
+
+  prelude "(* this is a prelude for Alt-Ergo integer arithmetic *)"
+
+  syntax function zero "0"
+  syntax function one  "1"
+
+  syntax function (+)  "(%1 + %2)"
+  syntax function (-)  "(%1 - %2)"
+  syntax function (*)  "(%1 * %2)"
+  syntax function (-_) "(-%1)"
+
+  meta "invalid trigger" predicate (<=)
+  meta "invalid trigger" predicate (<)
+  meta "invalid trigger" predicate (>=)
+  meta "invalid trigger" predicate (>)
+
+  syntax predicate (<=) "(%1 <= %2)"
+  syntax predicate (<)  "(%1 <  %2)"
+  syntax predicate (>=) "(%1 >= %2)"
+  syntax predicate (>)  "(%1 >  %2)"
+
+  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 Total
+  remove prop Antisymm
+  remove prop NonTrivialRing
+  remove prop CompatOrderAdd
+  remove prop ZeroLessOne
+
+end
+
+theory int.EuclideanDivision
+
+  syntax function div "(%1 / %2)"
+  syntax function mod "(%1 % %2)"
+
+end
+
+theory int.ComputerDivision
+
+  use for_drivers.ComputerOfEuclideanDivision
+
+end
+
+
+theory real.Real
+
+  prelude "(* this is a prelude for Alt-Ergo real arithmetic *)"
+
+  syntax function zero "0.0"
+  syntax function one  "1.0"
+
+  syntax function (+)  "(%1 + %2)"
+  syntax function (-)  "(%1 - %2)"
+  syntax function (*)  "(%1 * %2)"
+  syntax function (/)  "(%1 / %2)"
+  syntax function (-_) "(-%1)"
+  syntax function inv  "(1.0 / %1)"
+
+  meta "invalid trigger" predicate (<=)
+  meta "invalid trigger" predicate (<)
+  meta "invalid trigger" predicate (>=)
+  meta "invalid trigger" predicate (>)
+
+  syntax predicate (<=) "(%1 <= %2)"
+  syntax predicate (<)  "(%1 <  %2)"
+  syntax predicate (>=) "(%1 >= %2)"
+  syntax predicate (>)  "(%1 >  %2)"
+
+  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 Total
+  remove prop Antisymm
+  remove prop Inverse
+  remove prop NonTrivialRing
+  remove prop CompatOrderAdd
+  remove prop ZeroLessOne
+
+end
+
+theory ieee_float.Float64
+
+  syntax function (.+)  "(%1 + %2)"
+  syntax function (.-)  "(%1 - %2)"
+  syntax function (.*)  "(%1 * %2)"
+  syntax function (./)  "(%1 / %2)"
+  syntax function (.-_) "(-%1)"
+
+  syntax predicate le "%1 <= %2"
+  syntax predicate lt  "%1 <  %2"
+  syntax predicate ge "%1 >= %2"
+  syntax predicate gt  "%1 >  %2"
+
+
+end
+
+theory real.RealInfix
+
+  syntax function (+.)  "(%1 + %2)"
+  syntax function (-.)  "(%1 - %2)"
+  syntax function ( *.) "(%1 * %2)"
+  syntax function (/.)  "(%1 / %2)"
+  syntax function (-._) "(-%1)"
+
+  meta "invalid trigger" predicate (<=.)
+  meta "invalid trigger" predicate (<.)
+  meta "invalid trigger" predicate (>=.)
+  meta "invalid trigger" predicate (>.)
+
+  syntax predicate (<=.) "(%1 <= %2)"
+  syntax predicate (<.)  "(%1 <  %2)"
+  syntax predicate (>=.) "(%1 >= %2)"
+  syntax predicate (>.)  "(%1 >  %2)"
+
+end
+
+theory Bool
+  syntax type     bool  "bool"
+  syntax function True  "true"
+  syntax function False "false"
+end
+
+theory Tuple0
+  syntax type     tuple0 "unit"
+  syntax function Tuple0 "void"
+end
+
+theory algebra.AC
+  meta AC function op
+  remove prop Comm
+  remove prop Assoc
+end
+
+theory ieee_float.Float64
+  syntax predicate is_not_nan ""
+  remove allprops
+end
-- 
GitLab