diff --git a/algebra/agree.v b/algebra/agree.v index 4db475ddcdd6ceabba9255591af4f8318089e2a9..a451a5091aa1755c637d52be2efb03c7bfce6c4d 100644 --- a/algebra/agree.v +++ b/algebra/agree.v @@ -184,6 +184,9 @@ Program Definition agreeRF (F : cFunctor) : rFunctor := {| rFunctor_car A B := agreeR (cFunctor_car F A B); rFunctor_map A1 A2 B1 B2 fg := agreeC_map (cFunctor_map F fg) |}. +Next Obligation. + intros ? A1 A2 B1 B2 n ???; simpl. by apply agreeC_map_ne, cFunctor_ne. +Qed. Next Obligation. intros F A B x; simpl. rewrite -{2}(agree_map_id x). apply agree_map_ext=>y. by rewrite cFunctor_id. diff --git a/algebra/auth.v b/algebra/auth.v index faf993d3bd375312415877f82f80ec4f1ef56727..0b106788526fdb546dd71fd0008619e6c95ecbde 100644 --- a/algebra/auth.v +++ b/algebra/auth.v @@ -244,6 +244,9 @@ Program Definition authRF (F : rFunctor) : rFunctor := {| rFunctor_car A B := authR (rFunctor_car F A B); rFunctor_map A1 A2 B1 B2 fg := authC_map (rFunctor_map F fg) |}. +Next Obligation. + by intros F A1 A2 B1 B2 n f g Hfg; apply authC_map_ne, rFunctor_ne. +Qed. Next Obligation. intros F A B x. rewrite /= -{2}(auth_map_id x). apply auth_map_ext=>y; apply rFunctor_id. diff --git a/algebra/cmra.v b/algebra/cmra.v index a940eff8b124b767ace01cdf1f463b4b8d062900..4fd0fac48ecf32a4562e2747b47714790bafecb5 100644 --- a/algebra/cmra.v +++ b/algebra/cmra.v @@ -623,6 +623,8 @@ Structure rFunctor := RFunctor { rFunctor_car : cofeT → cofeT -> cmraT; rFunctor_map {A1 A2 B1 B2} : ((A2 -n> A1) * (B1 -n> B2)) → rFunctor_car A1 B1 -n> rFunctor_car A2 B2; + rFunctor_ne A1 A2 B1 B2 n : + Proper (dist n ==> dist n) (@rFunctor_map A1 A2 B1 B2); rFunctor_id {A B} (x : rFunctor_car A B) : rFunctor_map (cid,cid) x ≡ x; rFunctor_compose {A1 A2 A3 B1 B2 B3} (f : A2 -n> A1) (g : A3 -n> A2) (f' : B1 -n> B2) (g' : B2 -n> B3) x : @@ -630,21 +632,12 @@ Structure rFunctor := RFunctor { rFunctor_mono {A1 A2 B1 B2} (fg : (A2 -n> A1) * (B1 -n> B2)) : CMRAMonotone (rFunctor_map fg) }. -Existing Instances rFunctor_mono. +Existing Instances rFunctor_ne rFunctor_mono. Instance: Params (@rFunctor_map) 5. -Class rFunctorNe (F : rFunctor) := - rFunctor_ne A1 A2 B1 B2 n :> Proper (dist n ==> dist n) (@rFunctor_map F A1 A2 B1 B2). Class rFunctorContractive (F : rFunctor) := rFunctor_contractive A1 A2 B1 B2 :> Contractive (@rFunctor_map F A1 A2 B1 B2). -(* TODO: Check if this instance hurts us. We don't have such a large search space - overall, and because of the priority constCF and laterCF should be the only - users of this. *) -Instance rFunctorContractive_Ne F : - rFunctorContractive F → rFunctorNe F. -Proof. intros ?????. apply contractive_ne, _. Qed. - Definition rFunctor_diag (F: rFunctor) (A: cofeT) : cmraT := rFunctor_car F A A. Coercion rFunctor_diag : rFunctor >-> Funclass. @@ -653,25 +646,22 @@ Program Definition constRF (B : cmraT) : rFunctor := Solve Obligations with done. Instance constRF_contractive B : rFunctorContractive (constRF B). -Proof. intros ????. apply _. Qed. +Proof. rewrite /rFunctorContractive; apply _. Qed. Program Definition prodRF (F1 F2 : rFunctor) : rFunctor := {| rFunctor_car A B := prodR (rFunctor_car F1 A B) (rFunctor_car F2 A B); rFunctor_map A1 A2 B1 B2 fg := prodC_map (rFunctor_map F1 fg) (rFunctor_map F2 fg) |}. +Next Obligation. + intros F1 F2 A1 A2 B1 B2 n ???; by apply prodC_map_ne; apply rFunctor_ne. +Qed. Next Obligation. by intros F1 F2 A B [??]; rewrite /= !rFunctor_id. Qed. Next Obligation. intros F1 F2 A1 A2 A3 B1 B2 B3 f g f' g' [??]; simpl. by rewrite !rFunctor_compose. Qed. -Instance prodRF_ne F1 F2 : - rFunctorNe F1 → rFunctorNe F2 → rFunctorNe (prodRF F1 F2). -Proof. - intros ?? A1 A2 B1 B2 n ???; - by apply prodC_map_ne; apply rFunctor_ne. -Qed. Instance prodRF_contractive F1 F2 : rFunctorContractive F1 → rFunctorContractive F2 → rFunctorContractive (prodRF F1 F2). diff --git a/algebra/cofe.v b/algebra/cofe.v index a1a87b890f7eba869dd812d8f61416f77807e039..3fd8a65e4cee2510b8e2c6e1665fc90787a08d0f 100644 --- a/algebra/cofe.v +++ b/algebra/cofe.v @@ -336,26 +336,20 @@ Structure cFunctor := CFunctor { cFunctor_car : cofeT → cofeT -> cofeT; cFunctor_map {A1 A2 B1 B2} : ((A2 -n> A1) * (B1 -n> B2)) → cFunctor_car A1 B1 -n> cFunctor_car A2 B2; + cFunctor_ne {A1 A2 B1 B2} n : + Proper (dist n ==> dist n) (@cFunctor_map A1 A2 B1 B2); cFunctor_id {A B : cofeT} (x : cFunctor_car A B) : cFunctor_map (cid,cid) x ≡ x; cFunctor_compose {A1 A2 A3 B1 B2 B3} (f : A2 -n> A1) (g : A3 -n> A2) (f' : B1 -n> B2) (g' : B2 -n> B3) x : cFunctor_map (f◎g, g'◎f') x ≡ cFunctor_map (g,g') (cFunctor_map (f,f') x) }. +Existing Instance cFunctor_ne. Instance: Params (@cFunctor_map) 5. -Class cFunctorNe (F : cFunctor) := - cFunctor_ne A1 A2 B1 B2 n :> Proper (dist n ==> dist n) (@cFunctor_map F A1 A2 B1 B2). Class cFunctorContractive (F : cFunctor) := cFunctor_contractive A1 A2 B1 B2 :> Contractive (@cFunctor_map F A1 A2 B1 B2). -(* TODO: Check if this instance hurts us. We don't have such a large search space - overall, and because of the priority constCF and laterCF should be the only - users of this. *) -Instance cFunctorContractive_Ne F : - cFunctorContractive F → cFunctorNe F. -Proof. intros ?????. apply contractive_ne, _. Qed. - Definition cFunctor_diag (F: cFunctor) (A: cofeT) : cofeT := cFunctor_car F A A. Coercion cFunctor_diag : cFunctor >-> Funclass. @@ -364,32 +358,26 @@ Program Definition constCF (B : cofeT) : cFunctor := Solve Obligations with done. Instance constCF_contractive B : cFunctorContractive (constCF B). -Proof. intros ????. apply _. Qed. +Proof. rewrite /cFunctorContractive; apply _. Qed. Program Definition idCF : cFunctor := {| cFunctor_car A1 A2 := A2; cFunctor_map A1 A2 B1 B2 f := f.2 |}. Solve Obligations with done. -Instance idCF_ne : cFunctorNe idCF. -Proof. intros ????. solve_proper. Qed. - Program Definition prodCF (F1 F2 : cFunctor) : cFunctor := {| cFunctor_car A B := prodC (cFunctor_car F1 A B) (cFunctor_car F2 A B); cFunctor_map A1 A2 B1 B2 fg := prodC_map (cFunctor_map F1 fg) (cFunctor_map F2 fg) |}. +Next Obligation. + intros ?? A1 A2 B1 B2 n ???; by apply prodC_map_ne; apply cFunctor_ne. +Qed. Next Obligation. by intros F1 F2 A B [??]; rewrite /= !cFunctor_id. Qed. Next Obligation. intros F1 F2 A1 A2 A3 B1 B2 B3 f g f' g' [??]; simpl. by rewrite !cFunctor_compose. Qed. -Instance prodCF_ne F1 F2 : - cFunctorNe F1 → cFunctorNe F2 → cFunctorNe (prodCF F1 F2). -Proof. - intros ?? A1 A2 B1 B2 n ???; - by apply prodC_map_ne; apply cFunctor_ne. -Qed. Instance prodCF_contractive F1 F2 : cFunctorContractive F1 → cFunctorContractive F2 → cFunctorContractive (prodCF F1 F2). @@ -403,6 +391,10 @@ Program Definition cofe_morCF (F1 F2 : cFunctor) : cFunctor := {| cFunctor_map A1 A2 B1 B2 fg := cofe_morC_map (cFunctor_map F1 (fg.2, fg.1)) (cFunctor_map F2 fg) |}. +Next Obligation. + intros F1 F2 A1 A2 B1 B2 n [f g] [f' g'] Hfg; simpl in *. + apply cofe_morC_map_ne; apply cFunctor_ne; split; by apply Hfg. +Qed. Next Obligation. intros F1 F2 A B [f ?] ?; simpl. rewrite /= !cFunctor_id. apply (ne_proper f). apply cFunctor_id. @@ -412,12 +404,6 @@ Next Obligation. rewrite -!cFunctor_compose. do 2 apply (ne_proper _). apply cFunctor_compose. Qed. -Instance cofe_morCF_ne F1 F2 : - cFunctorNe F1 → cFunctorNe F2 → cFunctorNe (cofe_morCF F1 F2). -Proof. - intros ?? A1 A2 B1 B2 n [f g] [f' g'] Hfg; simpl in *. - apply cofe_morC_map_ne; apply cFunctor_ne; split; by apply Hfg. -Qed. Instance cofe_morCF_contractive F1 F2 : cFunctorContractive F1 → cFunctorContractive F2 → cFunctorContractive (cofe_morCF F1 F2). @@ -514,6 +500,10 @@ Program Definition laterCF (F : cFunctor) : cFunctor := {| cFunctor_car A B := laterC (cFunctor_car F A B); cFunctor_map A1 A2 B1 B2 fg := laterC_map (cFunctor_map F fg) |}. +Next Obligation. + intros F A1 A2 B1 B2 n fg fg' ?. + by apply (contractive_ne laterC_map), cFunctor_ne. +Qed. Next Obligation. intros F A B x; simpl. rewrite -{2}(later_map_id x). apply later_map_ext=>y. by rewrite cFunctor_id. @@ -523,9 +513,8 @@ Next Obligation. apply later_map_ext=>y; apply cFunctor_compose. Qed. -Instance laterCF_contractive F : - cFunctorNe F → cFunctorContractive (laterCF F). +Instance laterCF_contractive F : cFunctorContractive (laterCF F). Proof. - intros ? A1 A2 B1 B2 n fg fg' Hfg. + intros A1 A2 B1 B2 n fg fg' Hfg. apply laterC_map_contractive => i ?. by apply cFunctor_ne, Hfg. Qed. diff --git a/algebra/excl.v b/algebra/excl.v index bc1fe57df9fdeb32a077a69bf7319ffea26b2c96..a1dceaff48c38dacbb6618d4e7107fc0878fbc3d 100644 --- a/algebra/excl.v +++ b/algebra/excl.v @@ -205,6 +205,9 @@ Program Definition exclRF (F : cFunctor) : rFunctor := {| rFunctor_car A B := exclR (cFunctor_car F A B); rFunctor_map A1 A2 B1 B2 fg := exclC_map (cFunctor_map F fg) |}. +Next Obligation. + intros F A1 A2 B1 B2 n x1 x2 ??. by apply exclC_map_ne, cFunctor_ne. +Qed. Next Obligation. intros F A B x; simpl. rewrite -{2}(excl_map_id x). apply excl_map_ext=>y. by rewrite cFunctor_id. @@ -214,13 +217,8 @@ Next Obligation. apply excl_map_ext=>y; apply cFunctor_compose. Qed. -Instance exclRF_ne F : cFunctorNe F → rFunctorNe (exclRF F). -Proof. - intros A1 A2 B1 B2 n x1 x2 ??. by apply exclC_map_ne, cFunctor_ne. -Qed. Instance exclRF_contractive F : cFunctorContractive F → rFunctorContractive (exclRF F). Proof. - intros A1 A2 B1 B2 n x1 x2 ??. - by apply exclC_map_ne, cFunctor_contractive. + intros A1 A2 B1 B2 n x1 x2 ??. by apply exclC_map_ne, cFunctor_contractive. Qed. diff --git a/algebra/fin_maps.v b/algebra/fin_maps.v index a428f34d38fb4140a51991b4ea9cd7c152759d62..524436b3dfda59c6a0f4a6f209bab34f7651960f 100644 --- a/algebra/fin_maps.v +++ b/algebra/fin_maps.v @@ -356,6 +356,9 @@ Program Definition mapCF K `{Countable K} (F : cFunctor) : cFunctor := {| cFunctor_car A B := mapC K (cFunctor_car F A B); cFunctor_map A1 A2 B1 B2 fg := mapC_map (cFunctor_map F fg) |}. +Next Obligation. + by intros K ?? F A1 A2 B1 B2 n f g Hfg; apply mapC_map_ne, cFunctor_ne. +Qed. Next Obligation. intros K ?? F A B x. rewrite /= -{2}(map_fmap_id x). apply map_fmap_setoid_ext=>y ??; apply cFunctor_id. @@ -364,11 +367,6 @@ Next Obligation. intros K ?? F A1 A2 A3 B1 B2 B3 f g f' g' x. rewrite /= -map_fmap_compose. apply map_fmap_setoid_ext=>y ??; apply cFunctor_compose. Qed. - -Instance mapCF_ne K `{Countable K} F : cFunctorNe F → cFunctorNe (mapCF K F). -Proof. - by intros ? A1 A2 B1 B2 n f g Hfg; apply mapC_map_ne, cFunctor_ne. -Qed. Instance mapCF_contractive K `{Countable K} F : cFunctorContractive F → cFunctorContractive (mapCF K F). Proof. @@ -379,6 +377,9 @@ Program Definition mapRF K `{Countable K} (F : rFunctor) : rFunctor := {| rFunctor_car A B := mapR K (rFunctor_car F A B); rFunctor_map A1 A2 B1 B2 fg := mapC_map (rFunctor_map F fg) |}. +Next Obligation. + by intros K ?? F A1 A2 B1 B2 n f g Hfg; apply mapC_map_ne, rFunctor_ne. +Qed. Next Obligation. intros K ?? F A B x. rewrite /= -{2}(map_fmap_id x). apply map_fmap_setoid_ext=>y ??; apply rFunctor_id. @@ -387,11 +388,6 @@ Next Obligation. intros K ?? F A1 A2 A3 B1 B2 B3 f g f' g' x. rewrite /= -map_fmap_compose. apply map_fmap_setoid_ext=>y ??; apply rFunctor_compose. Qed. - -Instance mapRF_ne K `{Countable K} F : rFunctorNe F → rFunctorNe (mapRF K F). -Proof. - by intros ? A1 A2 B1 B2 n f g Hfg; apply mapC_map_ne, rFunctor_ne. -Qed. Instance mapRF_contractive K `{Countable K} F : rFunctorContractive F → rFunctorContractive (mapRF K F). Proof. diff --git a/algebra/frac.v b/algebra/frac.v index 5035c76caf47aaecb0685f4d4f46c6ae708717ca..308bb988854ef2e3bde4cb86c8a12e7f2e71d2a6 100644 --- a/algebra/frac.v +++ b/algebra/frac.v @@ -248,6 +248,9 @@ Program Definition fracRF (F : rFunctor) : rFunctor := {| rFunctor_car A B := fracR (rFunctor_car F A B); rFunctor_map A1 A2 B1 B2 fg := fracC_map (rFunctor_map F fg) |}. +Next Obligation. + by intros F A1 A2 B1 B2 n f g Hfg; apply fracC_map_ne, rFunctor_ne. +Qed. Next Obligation. intros F A B x. rewrite /= -{2}(frac_map_id x). apply frac_map_ext=>y; apply rFunctor_id. diff --git a/algebra/iprod.v b/algebra/iprod.v index d23ffc86ead50fffc7dcb53157813a70de1ee429..78c34aa8ccc4628f62935618f11f31d2882a5f62 100644 --- a/algebra/iprod.v +++ b/algebra/iprod.v @@ -292,6 +292,9 @@ Program Definition iprodCF {C} (F : C → cFunctor) : cFunctor := {| cFunctor_car A B := iprodC (λ c, cFunctor_car (F c) A B); cFunctor_map A1 A2 B1 B2 fg := iprodC_map (λ c, cFunctor_map (F c) fg) |}. +Next Obligation. + intros C F A1 A2 B1 B2 n ?? g. by apply iprodC_map_ne=>?; apply cFunctor_ne. +Qed. Next Obligation. intros C F A B g; simpl. rewrite -{2}(iprod_map_id g). apply iprod_map_ext=> y; apply cFunctor_id. @@ -300,13 +303,6 @@ Next Obligation. intros C F A1 A2 A3 B1 B2 B3 f1 f2 f1' f2' g. rewrite /= -iprod_map_compose. apply iprod_map_ext=>y; apply cFunctor_compose. Qed. - -Instance iprodCF_ne {C} (F : C → cFunctor) : - (∀ c, cFunctorNe (F c)) → cFunctorNe (iprodCF F). -Proof. - intros ? A1 A2 B1 B2 n ?? g. - by apply iprodC_map_ne=>c; apply cFunctor_ne. -Qed. Instance iprodCF_contractive {C} (F : C → cFunctor) : (∀ c, cFunctorContractive (F c)) → cFunctorContractive (iprodCF F). Proof. @@ -318,6 +314,9 @@ Program Definition iprodRF {C} (F : C → rFunctor) : rFunctor := {| rFunctor_car A B := iprodR (λ c, rFunctor_car (F c) A B); rFunctor_map A1 A2 B1 B2 fg := iprodC_map (λ c, rFunctor_map (F c) fg) |}. +Next Obligation. + intros C F A1 A2 B1 B2 n ?? g. by apply iprodC_map_ne=>?; apply rFunctor_ne. +Qed. Next Obligation. intros C F A B g; simpl. rewrite -{2}(iprod_map_id g). apply iprod_map_ext=> y; apply rFunctor_id. @@ -326,13 +325,6 @@ Next Obligation. intros C F A1 A2 A3 B1 B2 B3 f1 f2 f1' f2' g. rewrite /= -iprod_map_compose. apply iprod_map_ext=>y; apply rFunctor_compose. Qed. - -Instance iprodRF_ne {C} (F : C → rFunctor) : - (∀ c, rFunctorNe (F c)) → rFunctorNe (iprodRF F). -Proof. - intros ? A1 A2 B1 B2 n ?? g. - by apply iprodC_map_ne=>c; apply rFunctor_ne. -Qed. Instance iprodRF_contractive {C} (F : C → rFunctor) : (∀ c, rFunctorContractive (F c)) → rFunctorContractive (iprodRF F). Proof. diff --git a/algebra/option.v b/algebra/option.v index 8535787330496badf755cb418821ffb2b086696c..bbfa2b65367f881f93efa426fca030dd4e83d07e 100644 --- a/algebra/option.v +++ b/algebra/option.v @@ -193,6 +193,9 @@ Program Definition optionCF (F : cFunctor) : cFunctor := {| cFunctor_car A B := optionC (cFunctor_car F A B); cFunctor_map A1 A2 B1 B2 fg := optionC_map (cFunctor_map F fg) |}. +Next Obligation. + by intros F A1 A2 B1 B2 n f g Hfg; apply optionC_map_ne, cFunctor_ne. +Qed. Next Obligation. intros F A B x. rewrite /= -{2}(option_fmap_id x). apply option_fmap_setoid_ext=>y; apply cFunctor_id. @@ -202,10 +205,6 @@ Next Obligation. apply option_fmap_setoid_ext=>y; apply cFunctor_compose. Qed. -Instance optionCF_ne F : cFunctorNe F → cFunctorNe (optionCF F). -Proof. - by intros ? A1 A2 B1 B2 n f g Hfg; apply optionC_map_ne, cFunctor_ne. -Qed. Instance optionCF_contractive F : cFunctorContractive F → cFunctorContractive (optionCF F). Proof. @@ -216,6 +215,9 @@ Program Definition optionRF (F : rFunctor) : rFunctor := {| rFunctor_car A B := optionR (rFunctor_car F A B); rFunctor_map A1 A2 B1 B2 fg := optionC_map (rFunctor_map F fg) |}. +Next Obligation. + by intros F A1 A2 B1 B2 n f g Hfg; apply optionC_map_ne, rFunctor_ne. +Qed. Next Obligation. intros F A B x. rewrite /= -{2}(option_fmap_id x). apply option_fmap_setoid_ext=>y; apply rFunctor_id. @@ -225,10 +227,6 @@ Next Obligation. apply option_fmap_setoid_ext=>y; apply rFunctor_compose. Qed. -Instance optionRF_ne F : rFunctorNe F → rFunctorNe (optionRF F). -Proof. - by intros ? A1 A2 B1 B2 n f g Hfg; apply optionC_map_ne, rFunctor_ne. -Qed. Instance optionRF_contractive F : rFunctorContractive F → rFunctorContractive (optionRF F). Proof. diff --git a/algebra/upred.v b/algebra/upred.v index 0ff7b62ada0240039438b57393b7b2f453849546..f03850b05de8d1db86578b4841859115617d3dd7 100644 --- a/algebra/upred.v +++ b/algebra/upred.v @@ -101,6 +101,10 @@ Program Definition uPredCF (F : rFunctor) : cFunctor := {| cFunctor_car A B := uPredC (rFunctor_car F B A); cFunctor_map A1 A2 B1 B2 fg := uPredC_map (rFunctor_map F (fg.2, fg.1)) |}. +Next Obligation. + intros F A1 A2 B1 B2 n P Q HPQ. + apply uPredC_map_ne, rFunctor_ne; split; by apply HPQ. +Qed. Next Obligation. intros F A B P; simpl. rewrite -{2}(uPred_map_id P). apply uPred_map_ext=>y. by rewrite rFunctor_id. diff --git a/program_logic/resources.v b/program_logic/resources.v index 1d411a3bf7a2eea9c990c76a7ed936fccb8301cb..9c49bc8a2e0fa9d69ace78d87b4763e246b7f1b5 100644 --- a/program_logic/resources.v +++ b/program_logic/resources.v @@ -227,6 +227,11 @@ Program Definition resRF (Λ : language) rFunctor_car A B := resR Λ (cFunctor_car F1 A B) (rFunctor_car F2 A B); rFunctor_map A1 A2 B1 B2 fg :=resC_map (cFunctor_map F1 fg) (rFunctor_map F2 fg) |}. +Next Obligation. + intros Λ F1 F2 A1 A2 B1 B2 n f g Hfg; apply resC_map_ne. + - by apply cFunctor_ne. + - by apply rFunctor_ne. +Qed. Next Obligation. intros Λ F Σ A B x. rewrite /= -{2}(res_map_id x). apply res_map_ext=>y. apply cFunctor_id. apply rFunctor_id. diff --git a/program_logic/saved_prop.v b/program_logic/saved_prop.v index 51fd60d86c3e985c32cb601e8057a30d1cc008d4..5298742ffdc90837e5680608fc88905c84f51534 100644 --- a/program_logic/saved_prop.v +++ b/program_logic/saved_prop.v @@ -3,15 +3,11 @@ From program_logic Require Export ghost_ownership. Import uPred. Class savedPropG (Λ : language) (Σ : gFunctors) (F : cFunctor) := - SavedPropG { - saved_prop_F_contractive :> cFunctorNe F; - saved_prop_inG :> inG Λ Σ (agreeR $ laterC (F (iPreProp Λ (globalF Σ)))); - }. -Definition savedPropGF (F : cFunctor) `{cFunctorNe F} : - gFunctor := GFunctor (agreeRF $ laterCF F). -Instance inGF_savedPropG `{cFunctorNe F} - `{inGF Λ Σ (savedPropGF F)} : savedPropG Λ Σ F. -Proof. split; try apply _; apply: inGF_inG. Qed. + saved_prop_inG :> inG Λ Σ (agreeR (laterC (F (iPreProp Λ (globalF Σ))))). +Definition savedPropGF (F : cFunctor) : gFunctor := + GFunctor (agreeRF (laterCF F)). +Instance inGF_savedPropG `{inGF Λ Σ (savedPropGF F)} : savedPropG Λ Σ F. +Proof. apply: inGF_inG. Qed. Definition saved_prop_own `{savedPropG Λ Σ F} (γ : gname) (x : F (iPropG Λ Σ)) : iPropG Λ Σ :=