From 356d5192eeef4c63ea0da6e7eb20630d95f36431 Mon Sep 17 00:00:00 2001 From: Arthur Correnson <arthur.correnson@gmail.com> Date: Tue, 15 Jun 2021 15:51:53 +0200 Subject: [PATCH] [ieee/coq] correction of Iadd --- .lia.cache | Bin 0 -> 36 bytes src_common/ieee/coq/finterval.v | 209 ++++++++++++++++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 .lia.cache diff --git a/.lia.cache b/.lia.cache new file mode 100644 index 0000000000000000000000000000000000000000..7f35b0311a304a37cfee27e8f685073eecff91b1 GIT binary patch literal 36 hcmZpfx@;c<1A_n%g8&x@FIcd_(UIByKLj{90060P49@@n literal 0 HcmV?d00001 diff --git a/src_common/ieee/coq/finterval.v b/src_common/ieee/coq/finterval.v index e69de29bb..79ed30d37 100644 --- a/src_common/ieee/coq/finterval.v +++ b/src_common/ieee/coq/finterval.v @@ -0,0 +1,209 @@ +From Flocq Require Import IEEE754.BinarySingleNaN. +From Coq Require Import QArith Psatz Reals Extraction. + +Definition emax := 128%Z. +Definition prec := 24%Z. + +Definition B32 := binary_float prec emax. + +Record Interval : Type := MK_INTERVAL { + lo : B32; + hi : B32; + nan : bool; +}. + +Definition check (I : Interval) : bool := + negb (is_nan (lo I)) && negb (is_nan (hi I)). + +Ltac def_op := + unfold prec, emax; red; lia. + +Program Definition Fadd (m : mode) := @Bplus prec emax _ _ m. +Solve All Obligations with def_op. + +Compute (Fadd mode_NE B754_nan B754_nan). + +Program Definition Fsub (m : mode) := @Bminus prec emax _ _ m. +Solve All Obligations with def_op. + +Program Definition Flt := @Bltb prec emax. + +Program Definition Fle := @Bleb prec emax. + +Program Definition Feq := @Beqb prec emax. + +Notation "x <= y" := (Fle x y = true). +Notation "x <= y <= z" := (Fle x y = true /\ Fle y z = true). + +Definition contains (I : Interval) (x : B32) : Prop := + let a := lo I in + let b := hi I in + a <= x <= b. + +Notation "x ∈ I" := (contains I x) (at level 80). + +Definition is_infp (x : B32) := + match x with + | B754_infinity s => negb s + | _ => false + end. + +Definition is_infm (x : B32) := + match x with + | B754_infinity s => s + | _ => false + end. + +Definition are_opp_inf (x y : B32) := + match x, y with + | B754_infinity s1, B754_infinity s2 => + eqb s1 (negb s2) + | _, _ => false + end. + +Definition sum_to_nan (A B : Interval) : bool := + let a1 := lo A in + let a2 := lo B in + let b1 := hi A in + let b2 := hi B in + are_opp_inf a1 a2 || are_opp_inf b1 b2. + +Lemma sum_to_nan_iff : + forall A B, sum_to_nan A B = true <-> (are_opp_inf (lo A) (lo B) = true \/ are_opp_inf (hi A) (hi B) = true). +Proof. + intros; split; intros; unfold sum_to_nan in *. + - rewrite Bool.orb_true_iff in H. + destruct H; auto. + - destruct H; intuition. +Qed. + +Lemma opp_inf_iff: + forall x y, are_opp_inf x y = true <-> + (is_infp x = true /\ is_infm y = true) \/ + (is_infp y = true /\ is_infm x = true). +Proof. + intros [ ] [ ]; simpl; try intuition. + destruct s, s0; tauto. + + rewrite negb_true_iff in H. + rewrite H, H1; reflexivity. + + rewrite H, H1; reflexivity. +Qed. + +Lemma is_infm_iff: + forall x, is_infm x = true <-> x = B754_infinity true. +Proof. + intros [ ]; split; intros; try easy. + - destruct s; easy. + - destruct s; easy. +Qed. + +Lemma is_infp_iff: + forall x, is_infp x = true <-> x = B754_infinity false. +Proof. + intros [ ]; split; intros; try easy. + - destruct s; easy. + - destruct s; easy. +Qed. + +Axiom add_not_nan : + forall m x y, + is_nan x = false -> + is_nan y = false -> + are_opp_inf x y = false -> + is_nan (Fadd m x y) = false. + +Definition infp : B32 := B754_infinity false. +Definition infm : B32 := B754_infinity true. + +Definition Iadd (m : mode) (A B : Interval) : Interval := + let a := Fadd m (lo A) (lo B) in + let b := Fadd m (hi A) (hi B) in + let nan := (nan A || nan B || sum_to_nan A B) in + match sum_to_nan A B with + | true => MK_INTERVAL infp infm nan + | false => MK_INTERVAL a b nan + end. + +Axiom Fle_trans_inv: + forall x y z, x <= y <= z -> x <= z. + +Axiom Fle_infp_finite: + forall x, is_finite x = true -> infp <= x -> False. + +Axiom Fle_infm_finite: + forall x, is_finite x = true -> x <= infm -> False. + +Axiom Fadd_le_compat: + forall m w x y z, + is_nan w = false -> + is_nan x = false -> + is_nan y = false -> + is_nan z = false -> + w <= x -> y <= z -> + Fadd m w y <= Fadd m x z. + +Lemma is_finite_nan : + forall x:B32, is_finite x = true -> is_nan x = false. +Proof. + intros [ ] H; try easy. +Qed. + +Lemma Iadd_correct : + forall m ix iy x y, + is_finite x = true -> + is_finite y = true -> + check ix = true -> + check iy = true -> + contains ix x -> + contains iy y -> + contains (Iadd m ix iy) (Fadd m x y). +Proof. + intros m ix iy x y Fx Fy Hix Hiy [Hx1 Hx2] [Hy1 Hy2]. + unfold contains in *; split. + - unfold Iadd; destruct sum_to_nan eqn:E; cbn. + + rewrite sum_to_nan_iff in E. + destruct E as [ H | H ]; + rewrite opp_inf_iff in H; + destruct H as [ [H1 H2] | [H1 H2]]; + rewrite is_infm_iff in *; + rewrite is_infp_iff in *. + * rewrite H1 in Hx1. + eauto using H1, Fle_infp_finite. + * rewrite H1 in Hy1. + eauto using Fle_infp_finite. + * rewrite H2 in Hy2. + eauto using Fle_infm_finite. + * rewrite H2 in Hx2. + eauto using Fle_infm_finite. + + unfold check in *. + rewrite andb_true_iff in *. + destruct Hix as [Hix1 Hix2]. + destruct Hiy as [Hiy1 Hiy2]. + rewrite negb_true_iff in *. + apply is_finite_nan in Fx. + apply is_finite_nan in Fy. + now apply Fadd_le_compat. + - unfold Iadd; destruct sum_to_nan eqn:E; cbn. + + rewrite sum_to_nan_iff in E. + destruct E as [ H | H ]; + rewrite opp_inf_iff in H; + destruct H as [ [H1 H2] | [H1 H2]]; + rewrite is_infm_iff in *; + rewrite is_infp_iff in *. + * rewrite H1 in Hx1. + eauto using H1, Fle_infp_finite. + * rewrite H1 in Hy1. + eauto using Fle_infp_finite. + * rewrite H2 in Hy2. + eauto using Fle_infm_finite. + * rewrite H2 in Hx2. + eauto using Fle_infm_finite. + + unfold check in *. + rewrite andb_true_iff in *. + destruct Hix as [Hix1 Hix2]. + destruct Hiy as [Hiy1 Hiy2]. + rewrite negb_true_iff in *. + apply is_finite_nan in Fx. + apply is_finite_nan in Fy. + now apply Fadd_le_compat. +Qed. \ No newline at end of file -- GitLab