diff --git a/iris_plog.v b/iris_plog.v index 3f51b3869109cb94ec9862be320f7daf16c8c8e9..7dc8d6a247e524099b8b70b8305e1633483a3aa5 100644 --- a/iris_plog.v +++ b/iris_plog.v @@ -50,7 +50,7 @@ Module Type IRIS_PLOG (RL : VIRA_T) (C : CORE_LANG) (R: IRIS_RES RL C) (WP: WORL Lemma comp_finmap_remove w0 (s: nat -f> Wld) i w: s i == Some w -> - comp_finmap w0 s == comp_finmap w0 (fdStrongUpdate i None s) · w. + comp_finmap w0 s == comp_finmap w0 (s \ i) · w. Proof. revert s i w. apply:fdRect. - move=>s1 s2 EQs IH i w Hindom. @@ -89,7 +89,7 @@ Module Type IRIS_PLOG (RL : VIRA_T) (C : CORE_LANG) (R: IRIS_RES RL C) (WP: WORL Lemma comp_finmap_add w0 s i w: s i == None -> - comp_finmap w0 s · w == comp_finmap w0 (fdStrongUpdate i (Some w) s). + comp_finmap w0 s · w == comp_finmap w0 (s + [fd i <- w] ). Proof. revert s. apply:fdRect. - move=>f1 f2 EQf IH Hnew. rewrite -{2}EQf. rewrite -IH=>{IH}; last first. @@ -119,7 +119,9 @@ Module Type IRIS_PLOG (RL : VIRA_T) (C : CORE_LANG) (R: IRIS_RES RL C) (WP: WORL Qed. (* Go through some struggle to even write down world satisfaction... *) + (* Local Open Scope finmap_scope. + *) Lemma world_inv_val {wt n}: forall (pv: cmra_valid wt n) {i agP} (Heq: (Invs wt) i = n = Some agP), cmra_valid agP n. diff --git a/lib/ModuRes/Finmap.v b/lib/ModuRes/Finmap.v index f2b2282d004d2acdae496f297a91ea02530546ea..c5da2f2cc80c79f7a1bd055c41051606484f29b6 100644 --- a/lib/ModuRes/Finmap.v +++ b/lib/ModuRes/Finmap.v @@ -12,6 +12,8 @@ Local Open Scope finmap_scope. Local Open Scope general_if_scope. Infix "∈" := In (at level 31, no associativity) : finmap_scope. + + Section Def. Context {K V : Type}. @@ -27,7 +29,7 @@ Section Def. Context `{eqK : DecEq K}. - Definition dom (f: FinMap) := filter_dupes [] (findom f). + Definition dom (f: FinMap) := filter_dupes ([]%list) (findom f). Lemma dom_nodup (f: FinMap): NoDup (dom f). Proof. @@ -85,6 +87,8 @@ Arguments findom [K V] {eqK} _. Arguments dom [K V] {eqK} _. Arguments findom_b [K V] {eqK} _ {k}. Notation "K '-f>' V" := (FinMap K V) (at level 45). +(* TODO: find out what this does if anything *) +Bind Scope finmap_scope with FinMap. Section FinDom. Context {K} `{eqK : DecEq K}. @@ -331,7 +335,7 @@ Section FinDom. match v with | Some _ => k::(dom f) | None => match (dom f) with [] => [] - | k'::dom' => if dec_eq k k' then dom' else filter_dupes [k] (dom f) end + | k'::dom' => if dec_eq k k' then dom' else filter_dupes ([k]%list) (dom f) end end. Program Definition fdStrongUpdate k v (f : K -f> V) : K -f> V := mkFD (fun k' => if dec_eq k k' then v else f k') @@ -457,8 +461,14 @@ Section FinDom. End Map. - Notation "fd [ x -> v ]" := (fdStrongUpdate x (Some v) fd) (at level 50, x at next level) : finmap_scope. - Notation "fd \ x" := (fdStrongUpdate x None fd) (at level 50) : finmap_scope. +End FinDom. + +Notation "f + '[fd' k <- v ']'" := (fdStrongUpdate k (Some v) f) (at level 0) : finmap_scope. +Notation "f \ x" := (fdStrongUpdate x None f) (at level 35) : finmap_scope. + +Section FinDom2. + + Context {K} `{eqK : DecEq K}. Section MapProps. @@ -540,8 +550,7 @@ Section FinDom. Context (T: (K -f> V) -> Type) (Text: forall (f1 f2: K -f> V), equal_fd f1 f2 -> T f1 -> T f2) (Temp: T fdEmpty). - (* TODO: Why can't I use the sugar for finmaps?? *) - Context (Tstep: forall (k:K) (v:V) (f: K -f> V), ~(k ∈ dom f) -> T f -> T (fdStrongUpdate k (Some v) f)). + Context (Tstep: forall (k:K) (v:V) (f: K -f> V), ~(k ∈ dom f) -> T f -> T (f + [fd k <- v ] )). Definition fdRectInner: forall l f, dom f = l -> T f. Proof. @@ -551,7 +560,7 @@ Section FinDom. | k::l' => fun f Hdom => let f' := f \ k in let Hindom: k ∈ dom f := _ in let v' := fdLookup_indom f k Hindom in - Text (fdStrongUpdate k (Some v') f') f _ + Text (f' + [fd k <- v' ]) f _ (Tstep k v' f' _ (F l' f' _)) end); clear F. - split. @@ -566,7 +575,7 @@ Section FinDom. + rewrite Hdom /dom /=. f_equal. rewrite /dom /= Hdom. rewrite DecEq_refl. assert (Hnod := dom_nodup f). rewrite Hdom in Hnod. - assert (Hfilt1: (filter_dupes [] l') = l'). + assert (Hfilt1: (filter_dupes ([])%list l') = l'). { apply filter_dupes_id. simpl. inversion Hnod; subst. assumption. } rewrite Hfilt1. apply filter_dupes_id. assumption. - subst f'. apply fdLookup_notin. rewrite fdStrongUpdate_eq. reflexivity. @@ -632,10 +641,10 @@ Section FinDom. Lemma fdFoldAdd f k v: ~k ∈ (dom f) -> - fdFold (fdStrongUpdate k (Some v) f) = Tstep k v (fdFold f). + fdFold (f + [fd k <- v ] ) = Tstep k v (fdFold f). Proof. move=>Hindom. rewrite /fdFold /fdRect {2}/dom /=. - assert (Hl: fdStrongUpdate k (Some v) f k = Some v). + assert (Hl: f + [fd k <- v ] k = Some v). { apply fdStrongUpdate_eq. } eapply fdLookup_indom_corr in Hl. erewrite Hl. unfold id. f_equal. @@ -650,7 +659,7 @@ Section FinDom. Lemma fdFoldRedundantRemove f k: ~k ∈ (dom f) -> - fdFold (fdStrongUpdate k None f) = fdFold f. + fdFold (f \ k) = fdFold f. Proof. move=>Hindom. eapply fdFoldExtF. split. - move=>k'. simpl. apply fdLookup_notin_strong in Hindom. @@ -658,7 +667,7 @@ Section FinDom. + subst. now rewrite Hindom. + reflexivity. - rewrite /fdStrongUpdate /dom /= /dom. rewrite /dom in Hindom. - destruct (filter_dupes [] (findom f)) as [|k' dom'] eqn:Hdom'. + destruct (filter_dupes ([])%list (findom f)) as [|k' dom'] eqn:Hdom'. + reflexivity. + destruct (dec_eq k k') as [EQ|NEQ]. * subst k'. exfalso. apply Hindom. now left. @@ -831,7 +840,7 @@ Section FinDom. End Compose. -End FinDom. +End FinDom2. (*Arguments fdMap {K cT ord equ preo ord_part compK U V eqT mT cmT pTA pcmU eqT0 mT0 cmT0 pTA0 cmV} _.*) @@ -911,19 +920,19 @@ Section RA. - move=>f Hle. exists (fdEmpty (V:=S)). move=>k. simpl. specialize (Hle k). destruct (f k); last reflexivity. contradiction Hle. - - move=>k v f Hnin IH g Hle. destruct (IH (fdStrongUpdate k None g)) as [h Hh]=>{IH}. + - move=>k v f Hnin IH g Hle. destruct (IH (g \ k)) as [h Hh]=>{IH}. + move=>i. destruct (dec_eq k i) as [EQ|NEQ]. * subst i. rewrite fdStrongUpdate_eq. exact Logic.I. * erewrite fdStrongUpdate_neq by assumption. etransitivity; first now apply Hle. erewrite fdStrongUpdate_neq by assumption. reflexivity. + specialize (Hle k). rewrite fdStrongUpdate_eq in Hle. destruct (g k) eqn:EQg; last first. - { exists (fdStrongUpdate k (Some v) h). move=>i /= {Hle}. specialize (Hh i). simpl in Hh. + { exists (h + [fd k <- v ] ). move=>i /= {Hle}. specialize (Hh i). simpl in Hh. destruct (dec_eq k i) as [EQ|NEQ]. - subst i. rewrite EQg. reflexivity. - assumption. } - destruct Hle as [h' Hle]. - exists (fdStrongUpdate k (Some h') h). move=>i /=. + destruct Hle as [s' Hle]. + exists (h + [fd k <- s'] ). move=>i /=. specialize (Hh i). simpl in Hh. destruct (dec_eq k i) as [EQ|NEQ]. * subst i. rewrite EQg. simpl. assumption. * assumption.