From 8414e5ff65f562a56b8c76052f7f6e8a07a15488 Mon Sep 17 00:00:00 2001 From: Heiko Becker <hbecker@mpi-sws.org> Date: Fri, 4 May 2018 15:13:28 +0200 Subject: [PATCH] Extract general RoundoffErrorValidator --- coq/CertificateChecker.v | 6 +++--- coq/RoundoffErrorValidator.v | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 coq/RoundoffErrorValidator.v diff --git a/coq/CertificateChecker.v b/coq/CertificateChecker.v index 1874fac4..378bd7e5 100644 --- a/coq/CertificateChecker.v +++ b/coq/CertificateChecker.v @@ -6,7 +6,7 @@ **) Require Import Coq.Reals.Reals Coq.QArith.Qreals. Require Import Flover.Infra.RealSimps Flover.Infra.RationalSimps Flover.Infra.RealRationalProps Flover.Infra.Ltacs. -Require Import Flover.RealRangeValidator Flover.ErrorValidation Flover.Environments Flover.Typing Flover.FPRangeValidator. +Require Import Flover.RealRangeValidator Flover.RoundoffErrorValidator Flover.Environments Flover.Typing Flover.FPRangeValidator. Require Export Coq.QArith.QArith. Require Export Flover.Infra.ExpressionAbbrevs Flover.Commands. @@ -17,7 +17,7 @@ Definition CertificateChecker (e:expr Q) (absenv:analysisResult) (P:precond) (de if (typeCheck e defVars tMap) then if RangeValidator e absenv P && FPRangeValidator e absenv tMap NatSet.empty - then (validErrorbound e tMap absenv NatSet.empty) + then RoundoffErrorValidator e tMap absenv NatSet.empty else false else false. @@ -67,7 +67,7 @@ Proof. edestruct (RangeValidator_sound e absenv (P:=P) (Gamma:=defVars) (E:=E1)) as [iv_e [ err_e [vR [ map_e [eval_real real_bounds_e]]]]]; eauto. destruct iv_e as [elo ehi]. - edestruct (validErrorbound_sound e (typeMap defVars e (FloverMap.empty mType)) L approxE1E2 H0 eval_real R0 L1 H P_valid H1 map_e) as [[vF [mF eval_float]] err_bounded]; auto. + edestruct (RoundoffErrorValidator_sound e (typeMap defVars e (FloverMap.empty mType)) L approxE1E2 H0 eval_real R0 L1 H P_valid H1 map_e) as [[vF [mF eval_float]] err_bounded]; auto. exists (elo, ehi), err_e, vR, vF, mF; split; auto. Qed. diff --git a/coq/RoundoffErrorValidator.v b/coq/RoundoffErrorValidator.v new file mode 100644 index 00000000..2fd69bf1 --- /dev/null +++ b/coq/RoundoffErrorValidator.v @@ -0,0 +1,33 @@ +From Coq + Require Import Reals.Reals QArith.Qreals. + +From Flover + Require Export Infra.ExpressionAbbrevs ErrorValidation. + +Definition RoundoffErrorValidator (e:expr Q) (tMap:FloverMap.t mType) (A:analysisResult) (dVars:NatSet.t) := + (* if *) + validErrorbound e tMap A dVars. + (*then true *) + (* else validAffineErrorBounds e A tMap dVars *) + +Theorem RoundoffErrorValidator_sound: +forall (e : expr Q) (E1 E2 : env) (fVars dVars : NatSet.t) (A : analysisResult) + (nR : R) (err : error) (P : precond) (elo ehi : Q) (Gamma : FloverMap.t mType) + (defVars : nat -> option mType), + Typing.typeCheck e defVars Gamma = true -> + Environments.approxEnv E1 defVars A fVars dVars E2 -> + NatSet.Subset (usedVars e -- dVars) fVars -> + eval_expr E1 (toRMap defVars) (toREval (toRExp e)) nR REAL -> + RoundoffErrorValidator e Gamma A dVars = true -> + IntervalValidation.validIntervalbounds e A P dVars = true -> + IntervalValidation.dVars_range_valid dVars E1 A -> + IntervalValidation.fVars_P_sound fVars E1 P -> + IntervalValidation.vars_typed (fVars ∪ dVars) defVars -> + FloverMap.find (elt:=intv * error) e A = Some (elo, ehi, err) -> + (exists (nF : R) (m : mType), eval_expr E2 defVars (toRExp e) nF m) /\ + (forall (nF : R) (m : mType), eval_expr E2 defVars (toRExp e) nF m -> (Rabs (nR - nF) <= Q2R err)%R). +Proof. + intros. + cbn in *. + eapply validErrorbound_sound; eauto. +Qed. -- GitLab