From cf4310edc57300e18f7aaa2cec989f2e0c23f5ad Mon Sep 17 00:00:00 2001
From: Ralf Jung <jung@mpi-sws.org>
Date: Thu, 26 Feb 2015 15:40:28 +0100
Subject: [PATCH] make it finally, really possible to compile iris_core and
 MetricRec concurrently

---
 lib/ModuRes/CBUltInst.v | 66 +++++++++++++++++++++++++++++++++
 lib/ModuRes/Constr.v    | 81 +++++------------------------------------
 lib/ModuRes/MetricRec.v |  9 +----
 3 files changed, 77 insertions(+), 79 deletions(-)

diff --git a/lib/ModuRes/CBUltInst.v b/lib/ModuRes/CBUltInst.v
index 5ca04798c..b3547d422 100644
--- a/lib/ModuRes/CBUltInst.v
+++ b/lib/ModuRes/CBUltInst.v
@@ -58,3 +58,69 @@ Module CBUlt <: MCat.
 
   End Limits.
 End CBUlt.
+
+(* We can use the halve operation as functor *)
+Section Halving_Fun.
+  Context F {FA : BiFMap F} {FFun : BiFunctor F}.
+  Local Obligation Tactic := intros; resp_set || eauto.
+
+  Program Instance halveFMap : BiFMap (fun T1 T2 => halve (F T1 T2)) :=
+    fun m1 m2 m3 m4 => lift2m (lift2s (fun ars ob => fmorph (F := F) ars ob) _ _) _ _.
+  Next Obligation.
+    intros p1 p2 EQp x; simpl; rewrite EQp; reflexivity.
+  Qed.
+  Next Obligation.
+    intros e1 e2 EQ; simpl. unhalve.
+    rewrite EQ; reflexivity.
+  Qed.
+  Next Obligation.
+    intros p1 p2 EQ e; simpl; unhalve.
+    apply dist_mono in EQ.
+    rewrite EQ; reflexivity.
+  Qed.
+
+  Instance halveF : BiFunctor (fun T1 T2 => halve (F T1 T2)).
+  Proof.
+    split; intros.
+    + intros T; simpl.
+      apply (fmorph_comp _ _ _ _ _ _ _ _ _ _ T).
+    + intros T; simpl.
+      apply (fmorph_id _ _ T).
+  Qed.
+
+  Instance halve_contractive {m0 m1 m2 m3} :
+    contractive (@fmorph _ _ (fun T1 T2 => halve (F T1 T2)) _ m0 m1 m2 m3).
+  Proof.
+    intros n p1 p2 EQ f; simpl.
+    change ((fmorph (F := F) p1) f = n = (fmorph p2) f).
+    rewrite EQ; reflexivity.
+  Qed.
+
+End Halving_Fun.
+
+Module Type SimplInput(Cat : MCat).
+  Import Cat.
+
+  Parameter F : M -> M -> M.
+  Parameter FArr : BiFMap F.
+  Parameter FFun : BiFunctor F.
+
+  Parameter F_ne : (1 -t> F 1 1)%cat.
+End SimplInput.
+
+Module InputHalve (S : SimplInput (CBUlt)) : InputType(CBUlt)
+    with Definition F := fun T1 T2 => halve (S.F T1 T2).
+  Import CBUlt.
+  Local Existing Instance S.FArr.
+  Local Existing Instance S.FFun.
+  Local Open Scope cat_scope.
+
+  Definition F T1 T2 := halve (S.F T1 T2).
+  Definition FArr := halveFMap S.F.
+  Definition FFun := halveF S.F.
+
+  Definition tmorph_ne : 1 -t> F 1 1 :=
+    umconst (S.F_ne tt : F 1 1).
+
+  Definition F_contractive := @halve_contractive S.F _.
+End InputHalve.
diff --git a/lib/ModuRes/Constr.v b/lib/ModuRes/Constr.v
index a636315a6..5c3845a87 100644
--- a/lib/ModuRes/Constr.v
+++ b/lib/ModuRes/Constr.v
@@ -1,13 +1,21 @@
 (** This module provides some additional constructions on CBUlt. These
     are:
-    - the "1/2" functor, which divides all the distances by 1/2,
+    - the "1/2" operation, which divides all the distances by 1/2,
       and so makes any locally non-expansive functor locally
       contractive,
     - an extension operation on the space Tᵏ, for k ∈ nat, as a
       non-expansive morphism. *)
 
-Require Import MetricRec.
 Require Export UPred.
+Require Import MetricCore.
+Require Import Arith.
+
+Module NatDec.
+  Definition U := nat.
+  Definition eq_dec := eq_nat_dec.
+End NatDec.
+
+Module D := Coq.Logic.Eqdep_dec.DecidableEqDep(NatDec).
 
 Section Halving.
   Context (T : cmtyp).
@@ -66,75 +74,6 @@ Ltac unhalve :=
     | |- ?f = ?n = ?g => destruct n as [| n]; [exact I | change (f = n = g) ]
   end.
 
-(* TODO: Refactor the following so that one can make it work for PCM
-         instantiation without a lot of extra work. *)
-Require Import CBUltInst.
-
-Section Halving_Fun.
-  Context F {FA : BiFMap F} {FFun : BiFunctor F}.
-  Local Obligation Tactic := intros; resp_set || eauto.
-
-  Program Instance halveFMap : BiFMap (fun T1 T2 => halve (F T1 T2)) :=
-    fun m1 m2 m3 m4 => lift2m (lift2s (fun ars ob => fmorph (F := F) ars ob) _ _) _ _.
-  Next Obligation.
-    intros p1 p2 EQp x; simpl; rewrite EQp; reflexivity.
-  Qed.
-  Next Obligation.
-    intros e1 e2 EQ; simpl. unhalve.
-    rewrite EQ; reflexivity.
-  Qed.
-  Next Obligation.
-    intros p1 p2 EQ e; simpl; unhalve.
-    apply dist_mono in EQ.
-    rewrite EQ; reflexivity.
-  Qed.
-
-  Instance halveF : BiFunctor (fun T1 T2 => halve (F T1 T2)).
-  Proof.
-    split; intros.
-    + intros T; simpl.
-      apply (fmorph_comp _ _ _ _ _ _ _ _ _ _ T).
-    + intros T; simpl.
-      apply (fmorph_id _ _ T).
-  Qed.
-
-  Instance halve_contractive {m0 m1 m2 m3} :
-    contractive (@fmorph _ _ (fun T1 T2 => halve (F T1 T2)) _ m0 m1 m2 m3).
-  Proof.
-    intros n p1 p2 EQ f; simpl.
-    change ((fmorph (F := F) p1) f = n = (fmorph p2) f).
-    rewrite EQ; reflexivity.
-  Qed.
-
-End Halving_Fun.
-
-Module Type SimplInput(Cat : MCat).
-  Import Cat.
-
-  Parameter F : M -> M -> M.
-  Parameter FArr : BiFMap F.
-  Parameter FFun : BiFunctor F.
-
-  Parameter F_ne : (1 -t> F 1 1)%cat.
-End SimplInput.
-
-Module InputHalve (S : SimplInput (CBUlt)) : InputType(CBUlt)
-    with Definition F := fun T1 T2 => halve (S.F T1 T2).
-  Import CBUlt.
-  Local Existing Instance S.FArr.
-  Local Existing Instance S.FFun.
-  Local Open Scope cat_scope.
-
-  Definition F T1 T2 := halve (S.F T1 T2).
-  Definition FArr := halveFMap S.F.
-  Definition FFun := halveF S.F.
-
-  Definition tmorph_ne : 1 -t> F 1 1 :=
-    umconst (S.F_ne tt : F 1 1).
-
-  Definition F_contractive := @halve_contractive S.F _.
-End InputHalve.
-
 (** Trivial extension of a nonexpansive morphism to monotone one on a
     metric space equipped with a trivial preorder. *)
 Section DiscM_Defs.
diff --git a/lib/ModuRes/MetricRec.v b/lib/ModuRes/MetricRec.v
index 7d3963264..5f380d0e1 100644
--- a/lib/ModuRes/MetricRec.v
+++ b/lib/ModuRes/MetricRec.v
@@ -1,13 +1,6 @@
-Require Import MetricCore.
+Require Import MetricCore Constr.
 Require Import Arith.
 
-Module NatDec.
-  Definition U := nat.
-  Definition eq_dec := eq_nat_dec.
-End NatDec.
-
-Module D := Coq.Logic.Eqdep_dec.DecidableEqDep(NatDec).
-
 (** A category enriched in complete bisected metric spaces and with a terminal object. *)
 
 Class BC_morph T := tmorph : T -> T -> cmtyp.
-- 
GitLab