aboutsummaryrefslogtreecommitdiffhomepage
path: root/plugins/micromega/Lra.v
diff options
context:
space:
mode:
authorGravatar Frédéric Besson <frederic.besson@inria.fr>2016-08-30 17:12:27 +0200
committerGravatar Frédéric Besson <frederic.besson@inria.fr>2016-08-30 17:59:59 +0200
commit721637c98514a77d05d080f53f226cab3a8da1e7 (patch)
tree9a04e0482488764d39c0e24847e93f4b23f62cde /plugins/micromega/Lra.v
parent44ada644ef50563aa52cfcd7717d44bde29e5a20 (diff)
plugin micromega : nra also handles non-linear rational arithmetic over Q (Fixed #4985)
Lqa.v defines the tactics lra and nra working over Q. Lra.v defines the tactics lra and nra working over R.
Diffstat (limited to 'plugins/micromega/Lra.v')
-rw-r--r--plugins/micromega/Lra.v56
1 files changed, 56 insertions, 0 deletions
diff --git a/plugins/micromega/Lra.v b/plugins/micromega/Lra.v
new file mode 100644
index 000000000..7ffe1e4ed
--- /dev/null
+++ b/plugins/micromega/Lra.v
@@ -0,0 +1,56 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2016 *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2016 *)
+(* *)
+(************************************************************************)
+
+Require Import RMicromega.
+Require Import QMicromega.
+Require Import Rdefinitions.
+Require Import RingMicromega.
+Require Import VarMap.
+Require Coq.micromega.Tauto.
+Declare ML Module "micromega_plugin".
+
+(** Here, lra stands for linear real arithmetic *)
+Ltac lra :=
+ unfold Rdiv in * ;
+ lra_R ;
+ (abstract((intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Reval_formula (@find R 0%R __varmap)) __ff) ;
+ apply (RTautoChecker_sound __ff __wit); vm_cast_no_check (eq_refl true)))).
+
+(** Here, nra stands for non-linear real arithmetic *)
+Ltac nra :=
+ xnra ;
+ (abstract((intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Reval_formula (@find R 0%R __varmap)) __ff) ;
+ apply (RTautoChecker_sound __ff __wit); vm_cast_no_check (eq_refl true)))).
+
+Ltac xpsatz dom d :=
+ let tac := lazymatch dom with
+ | R =>
+ (sos_R || psatz_R d) ;
+ (* If csdp is not installed, the previous step might not produce any
+ progress: the rest of the tactical will then fail. Hence the 'try'. *)
+ try (abstract(intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Reval_formula (@find R 0%R __varmap)) __ff) ;
+ apply (RTautoChecker_sound __ff __wit); vm_cast_no_check (eq_refl true)))
+ | _ => fail "Unsupported domain"
+ end in tac.
+
+Tactic Notation "psatz" constr(dom) int_or_var(n) := xpsatz dom n.
+Tactic Notation "psatz" constr(dom) := xpsatz dom ltac:(-1).
+
+
+(* Local Variables: *)
+(* coding: utf-8 *)
+(* End: *)