From 91bdb9495d19c95e49f7b546144e040ae189ac8f Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Thu, 19 Feb 2015 16:03:31 +0100 Subject: [PATCH] no longer assume RA validity to be computable --- iris_meta.v | 2 +- iris_vs.v | 8 +++---- lib/ModuRes/RA.v | 54 +++++++++++++++++++++--------------------------- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/iris_meta.v b/iris_meta.v index 296946f5d..b60ae7bf6 100644 --- a/iris_meta.v +++ b/iris_meta.v @@ -136,7 +136,7 @@ Module IrisMeta (RL : RA_T) (C : CORE_LANG). Proof. destruct (steps_stepn _ _ HSN) as [n HSN']. clear HSN. pose↓ r := (ex_own _ σ, 1:RL.res). - { unfold ra_valid. simpl. eapply ra_valid_unit. now apply _. } + { unfold ra_valid. simpl. split; [|eapply ra_valid_unit; now apply _]. exact I. } edestruct (adequacy_ht (w:=fdEmpty) (k:=k') (r:=r) HT HSN') as [w' [rs' [φs' [HW [HSWTP HWS] ] ] ] ]; clear HT HSN'. - exists (ra_unit _); now rewrite ->ra_op_unit by apply _. - hnf. rewrite Plus.plus_comm. exists (fdEmpty (V:=pres)). split. diff --git a/iris_vs.v b/iris_vs.v index 59f9b91e0..4f689abc0 100644 --- a/iris_vs.v +++ b/iris_vs.v @@ -248,20 +248,20 @@ Module IrisVS (RL : RA_T) (C : CORE_LANG). destruct HE as [rs [ Hsat HE] ]. rewrite <-assoc in Hsat. simpl in Hsat. destruct Hsat as [Hval Hst]. destruct HG as [ [rdp rdl] [_ EQrl] ]. simpl in EQrl. clear rdp. destruct (HU (rdl · snd(rf · comp_map rs))) as [rsl [HPrsl HCrsl] ]. - - clear - Hval EQrl. eapply ra_prod_valid2 in Hval. destruct Hval as [_ Hsnd]. + - clear - Hval EQrl. eapply ra_prod_valid in Hval. destruct Hval as [_ Hsnd]. rewrite ->assoc, (comm rl), EQrl. rewrite ra_op_prod_snd in Hsnd. exact Hsnd. - exists w'. exists↓ (rp', rsl). { clear - Hval HCrsl. apply ra_prod_valid. split; [|auto_valid]. - eapply ra_prod_valid2 in Hval. destruct Hval as [Hfst _]. + eapply ra_prod_valid in Hval. destruct Hval as [Hfst _]. rewrite ra_op_prod_fst in Hfst. auto_valid. } split; first reflexivity. split. + exists (exist _ rsl HPrsl). simpl. exists (rp', 1:RL.res). simpl. rewrite ra_op_unit ra_op_unit2. split; reflexivity. - + exists rs. split; [| assumption]; clear HE. rewrite <-assoc. split; [eapply ra_prod_valid2; split|]. - * clear - Hval. eapply ra_prod_valid2 in Hval. destruct Hval as [Hfst _]. + + exists rs. split; [| assumption]; clear HE. rewrite <-assoc. split; [eapply ra_prod_valid; split|]. + * clear - Hval. eapply ra_prod_valid in Hval. destruct Hval as [Hfst _]. rewrite ra_op_prod_fst in Hfst. rewrite ra_op_prod_fst. exact Hfst. * clear -HCrsl. rewrite ->!assoc, (comm rsl), <-assoc in HCrsl. diff --git a/lib/ModuRes/RA.v b/lib/ModuRes/RA.v index b9507107d..827920079 100644 --- a/lib/ModuRes/RA.v +++ b/lib/ModuRes/RA.v @@ -16,29 +16,25 @@ Section Definitions. Class RA_unit := ra_unit : T. Class RA_op := ra_op : T -> T -> T. - Class RA_valid:= ra_valid : T -> bool. + Class RA_valid:= ra_valid : T -> Prop. Class RA {TU : RA_unit} {TOP : RA_op} {TV : RA_valid}: Prop := mkRA { ra_op_proper :> Proper (equiv ==> equiv ==> equiv) ra_op; ra_op_assoc :> Associative ra_op; ra_op_comm :> Commutative ra_op; ra_op_unit t : ra_op ra_unit t == t; - ra_valid_proper :> Proper (equiv ==> eq) ra_valid; - ra_valid_unit : ra_valid ra_unit = true; - ra_op_valid t1 t2 : ra_valid (ra_op t1 t2) = true -> ra_valid t1 = true + ra_valid_proper :> Proper (equiv ==> iff) ra_valid; + ra_valid_unit : ra_valid ra_unit; + ra_op_valid t1 t2 : ra_valid (ra_op t1 t2) -> ra_valid t1 }. End Definitions. Arguments ra_valid {T} {_} t. Notation "1" := (ra_unit _) : ra_scope. Notation "p · q" := (ra_op _ p q) (at level 40, left associativity) : ra_scope. -Notation "'↓' p" := (ra_valid p = true) (at level 35) : ra_scope. -Notation "'~' '↓' p" := (ra_valid p <> true) (at level 35) : ra_scope. +Notation "'↓' p" := (ra_valid p) (at level 35) : ra_scope. Delimit Scope ra_scope with ra. -Tactic Notation "decide↓" ident(t1) "as" ident(H) := destruct (ra_valid t1) eqn:H; [|apply not_true_iff_false in H]. - - (* General RA lemmas *) Section RAs. Context {T} `{RA T}. @@ -79,7 +75,7 @@ Section Products. | (s1, t1), (s2, t2) => (s1 · s2, t1 · t2) end. Global Instance ra_valid_prod : RA_valid (S * T) := - fun st => match st with (s, t) => ra_valid s && ra_valid t + fun st => match st with (s, t) => ra_valid s /\ ra_valid t end. Global Instance ra_prod : RA (S * T). Proof. @@ -91,8 +87,8 @@ Section Products. - intros [s t]. simpl; split; now rewrite ra_op_unit. - intros [s1 t1] [s2 t2] [Heqs Heqt]. unfold ra_valid; simpl in *. rewrite Heqs, Heqt. reflexivity. - - unfold ra_unit, ra_valid; simpl. erewrite !ra_valid_unit by apply _. reflexivity. - - intros [s1 t1] [s2 t2]. unfold ra_valid; simpl. rewrite !andb_true_iff. intros [H1 H2]. split. + - unfold ra_unit, ra_valid; simpl. split; eapply ra_valid_unit; now apply _. + - intros [s1 t1] [s2 t2]. unfold ra_valid; simpl. intros [H1 H2]. split. + eapply ra_op_valid; now eauto. + eapply ra_op_valid; now eauto. Qed. @@ -114,19 +110,10 @@ Section ProductLemmas. destruct st1 as [s1 t1]. destruct st2 as [s2 t2]. reflexivity. Qed. - Lemma ra_prod_valid (s: S) (t: T): - ↓(s, t) <-> ↓s /\ ↓t. - Proof. - unfold ra_valid, ra_valid_prod. - rewrite andb_true_iff. - reflexivity. - Qed. - - Lemma ra_prod_valid2 (st: S*T): + Lemma ra_prod_valid (st: S*T): ↓st <-> ↓(fst st) /\ ↓(snd st). Proof. destruct st as [s t]. unfold ra_valid, ra_valid_prod. - rewrite andb_true_iff. tauto. Qed. @@ -139,11 +126,13 @@ Section PositiveCarrier. Definition ra_pos: Type := { r | ↓ r }. Coercion ra_proj (t:ra_pos): T := proj1_sig t. + Global Instance ra_pos_type : Setoid ra_pos := _. + Definition ra_mk_pos t {VAL: ↓ t}: ra_pos := exist _ t VAL. Program Definition ra_pos_unit: ra_pos := exist _ 1 _. Next Obligation. - now erewrite ra_valid_unit by apply _. + now eapply ra_valid_unit; apply _. Qed. Lemma ra_proj_cancel r (VAL: ↓r): @@ -180,16 +169,19 @@ Ltac auto_valid_inner := solve [ eapply ra_op_pos_valid; (eassumption || rewrite comm; eassumption) | eapply ra_op_pos_valid2; (eassumption || rewrite comm; eassumption) | eapply ra_op_valid; (eassumption || rewrite comm; eassumption) ]. -Ltac auto_valid := match goal with - | |- @ra_valid ?T _ _ = true => +Ltac auto_valid := idtac; match goal with + | |- @ra_valid ?T _ _ => let H := fresh in assert (H : RA T) by apply _; auto_valid_inner end. (* FIXME put the common parts into a helper tactic, and allow arbitrary tactics after "by" *) -Tactic Notation "exists↓" constr(t) := let H := fresh "Hval" in assert(H:(↓t)%ra); [|exists (ra_mk_pos t (VAL:=H) ) ]. -Tactic Notation "exists↓" constr(t) "by" "auto_valid" := let H := fresh "Hval" in assert(H:(↓t)%ra); [auto_valid|exists (ra_mk_pos t (VAL:=H) ) ]. -Tactic Notation "pose↓" ident(name) ":=" constr(t) := let H := fresh "Hval" in assert(H:(↓t)%ra); [|pose (name := ra_mk_pos t (VAL:=H) ) ]. -Tactic Notation "pose↓" ident(name) ":=" constr(t) "by" "auto_valid" := let H := fresh "Hval" in assert(H:(↓t)%ra); [auto_valid|pose (name := ra_mk_pos t (VAL:=H) ) ]. +Ltac exists_valid t tac := let H := fresh "Hval" in assert(H:(↓t)%ra); [tac|exists (ra_mk_pos t (VAL:=H) ) ]. +Tactic Notation "exists↓" constr(t) := exists_valid t idtac. +Tactic Notation "exists↓" constr(t) "by" tactic(tac) := exists_valid t ltac:(now tac). + +Ltac pose_valid name t tac := let H := fresh "Hval" in assert(H:(↓t)%ra); [tac|pose (name := ra_mk_pos t (VAL:=H) ) ]. +Tactic Notation "pose↓" ident(name) ":=" constr(t) := pose_valid name t idtac. +Tactic Notation "pose↓" ident(name) ":=" constr(t) "by" tactic(tac) := pose_valid name t ltac:(now tac). Section Order. @@ -299,8 +291,8 @@ Section Exclusive. end. Global Instance ra_valid_ex : RA_valid ra_res_ex := fun e => match e with - | ex_bot => false - | _ => true + | ex_bot => False + | _ => True end. Global Instance ra_ex : RA ra_res_ex. -- GitLab