From f79a0b6fec23f4cbfccc619b821857cf0f46f44d Mon Sep 17 00:00:00 2001 From: Robbert Krebbers <mail@robbertkrebbers.nl> Date: Wed, 27 Jul 2016 12:56:27 +0200 Subject: [PATCH] Make the types of the finite map type classes more specific. This makes type checking more directed, and somewhat more predictable. On the downside, it makes it impossible to declare the singleton on lists as an instance of SingletonM and the insert and alter operations on functions as instances of Alter and Insert. However, these were not used often anyway. --- theories/base.v | 56 +++++++++++++------------------ theories/coPset.v | 4 +-- theories/fin_map_dom.v | 7 ++-- theories/fin_maps.v | 76 ++++++++++++++++++++---------------------- theories/functions.v | 26 +++++++-------- theories/gmap.v | 9 +++-- theories/list.v | 24 ++++++------- theories/mapset.v | 2 +- theories/natmap.v | 8 ++--- theories/nmap.v | 8 ++--- theories/option.v | 8 ++--- theories/pmap.v | 14 ++++---- theories/zmap.v | 8 ++--- 13 files changed, 118 insertions(+), 132 deletions(-) diff --git a/theories/base.v b/theories/base.v index b046cf8e..40e58b18 100644 --- a/theories/base.v +++ b/theories/base.v @@ -785,7 +785,7 @@ Notation "'guard' P 'as' H ; o" := (mguard P (λ H, o)) (** In this section we define operational type classes for the operations on maps. In the file [fin_maps] we will axiomatize finite maps. The function look up [m !! k] should yield the element at key [k] in [m]. *) -Class Lookup (K A M : Type) := lookup: K → M → option A. +Class Lookup (K : Type) (M : Type → Type) := lookup : ∀ {A}, K → M A → option A. Instance: Params (@lookup) 4. Notation "m !! i" := (lookup i m) (at level 20) : C_scope. Notation "(!!)" := lookup (only parsing) : C_scope. @@ -794,13 +794,14 @@ Notation "(!! i )" := (lookup i) (only parsing) : C_scope. Arguments lookup _ _ _ _ !_ !_ / : simpl nomatch. (** The singleton map *) -Class SingletonM K A M := singletonM: K → A → M. +Class SingletonM (K : Type) (M : Type → Type) := + singletonM : ∀ {A}, K → A → M A. Instance: Params (@singletonM) 5. Notation "{[ k := a ]}" := (singletonM k a) (at level 1) : C_scope. (** The function insert [<[k:=a]>m] should update the element at key [k] with value [a] in [m]. *) -Class Insert (K A M : Type) := insert: K → A → M → M. +Class Insert (K : Type) (M : Type → Type) := insert : ∀ {A}, K → A → M A → M A. Instance: Params (@insert) 5. Notation "<[ k := a ]>" := (insert k a) (at level 5, right associativity, format "<[ k := a ]>") : C_scope. @@ -809,13 +810,14 @@ Arguments insert _ _ _ _ !_ _ !_ / : simpl nomatch. (** The function delete [delete k m] should delete the value at key [k] in [m]. If the key [k] is not a member of [m], the original map should be returned. *) -Class Delete (K M : Type) := delete: K → M → M. -Instance: Params (@delete) 4. -Arguments delete _ _ _ !_ !_ / : simpl nomatch. +Class Delete (K : Type) (M : Type → Type) := delete : ∀ {A}, K → M A → M A. +Instance: Params (@delete) 5. +Arguments delete _ _ _ _ !_ !_ / : simpl nomatch. (** The function [alter f k m] should update the value at key [k] using the function [f], which is called with the original value. *) -Class Alter (K A M : Type) := alter: (A → A) → K → M → M. +Class Alter (K : Type) (M : Type → Type) := + alter : ∀ {A}, (A → A) → K → M A → M A. Instance: Params (@alter) 5. Arguments alter {_ _ _ _} _ !_ !_ / : simpl nomatch. @@ -823,16 +825,16 @@ Arguments alter {_ _ _ _} _ !_ !_ / : simpl nomatch. function [f], which is called with the original value at key [k] or [None] if [k] is not a member of [m]. The value at [k] should be deleted if [f] yields [None]. *) -Class PartialAlter (K A M : Type) := - partial_alter: (option A → option A) → K → M → M. +Class PartialAlter (K : Type) (M : Type → Type) := + partial_alter : ∀ {A}, (option A → option A) → K → M A → M A. Instance: Params (@partial_alter) 4. Arguments partial_alter _ _ _ _ _ !_ !_ / : simpl nomatch. (** The function [dom C m] should yield the domain of [m]. That is a finite collection of type [C] that contains the keys that are a member of [m]. *) -Class Dom (M C : Type) := dom: M → C. -Instance: Params (@dom) 3. -Arguments dom {_} _ {_} !_ / : simpl nomatch, clear implicits. +Class Dom (M : Type → Type) (C : Type) := dom : ∀ {A}, M A → C. +Instance: Params (@dom) 4. +Arguments dom {_} _ {_ _} !_ / : simpl nomatch, clear implicits. (** The function [merge f m1 m2] should merge the maps [m1] and [m2] by constructing a new map whose value at key [k] is [f (m1 !! k) (m2 !! k)].*) @@ -844,39 +846,27 @@ Arguments merge _ _ _ _ _ _ !_ !_ / : simpl nomatch. (** The function [union_with f m1 m2] is supposed to yield the union of [m1] and [m2] using the function [f] to combine values of members that are in both [m1] and [m2]. *) -Class UnionWith (A M : Type) := - union_with: (A → A → option A) → M → M → M. +Class UnionWith (M : Type → Type) := + union_with : ∀ {A}, (A → A → option A) → M A → M A → M A. Instance: Params (@union_with) 3. Arguments union_with {_ _ _} _ !_ !_ / : simpl nomatch. (** Similarly for intersection and difference. *) -Class IntersectionWith (A M : Type) := - intersection_with: (A → A → option A) → M → M → M. +Class IntersectionWith (M : Type → Type) := + intersection_with : ∀ {A}, (A → A → option A) → M A → M A → M A. Instance: Params (@intersection_with) 3. Arguments intersection_with {_ _ _} _ !_ !_ / : simpl nomatch. -Class DifferenceWith (A M : Type) := - difference_with: (A → A → option A) → M → M → M. +Class DifferenceWith (M : Type → Type) := + difference_with : ∀ {A}, (A → A → option A) → M A → M A → M A. Instance: Params (@difference_with) 3. Arguments difference_with {_ _ _} _ !_ !_ / : simpl nomatch. -Definition intersection_with_list `{IntersectionWith A M} - (f : A → A → option A) : M → list M → M := fold_right (intersection_with f). +Definition intersection_with_list `{IntersectionWith M} {A} + (f : A → A → option A) : M A → list (M A) → M A := + fold_right (intersection_with f). Arguments intersection_with_list _ _ _ _ _ !_ /. -Class LookupE (E K A M : Type) := lookupE: E → K → M → option A. -Instance: Params (@lookupE) 6. -Notation "m !!{ Γ } i" := (lookupE Γ i m) - (at level 20, format "m !!{ Γ } i") : C_scope. -Notation "(!!{ Γ } )" := (lookupE Γ) (only parsing, Γ at level 1) : C_scope. -Arguments lookupE _ _ _ _ _ _ !_ !_ / : simpl nomatch. - -Class InsertE (E K A M : Type) := insertE: E → K → A → M → M. -Instance: Params (@insertE) 6. -Notation "<[ k := a ]{ Γ }>" := (insertE Γ k a) - (at level 5, right associativity, format "<[ k := a ]{ Γ }>") : C_scope. -Arguments insertE _ _ _ _ _ _ !_ _ !_ / : simpl nomatch. - (** * Axiomatization of collections *) (** The class [SimpleCollection A C] axiomatizes a collection of type [C] with diff --git a/theories/coPset.v b/theories/coPset.v index b1086528..2c5d25a2 100644 --- a/theories/coPset.v +++ b/theories/coPset.v @@ -326,13 +326,13 @@ Proof. Qed. (** * Domain of finite maps *) -Instance Pmap_dom_coPset {A} : Dom (Pmap A) coPset := λ m, of_Pset (dom _ m). +Instance Pmap_dom_coPset : Dom Pmap coPset := λ A m, of_Pset (dom _ m). Instance Pmap_dom_coPset_spec: FinMapDom positive Pmap coPset. Proof. split; try apply _; intros A m i; unfold dom, Pmap_dom_coPset. by rewrite elem_of_of_Pset, elem_of_dom. Qed. -Instance gmap_dom_coPset {A} : Dom (gmap positive A) coPset := λ m, +Instance gmap_dom_coPset : Dom (gmap positive) coPset := λ A m, of_gset (dom _ m). Instance gmap_dom_coPset_spec: FinMapDom positive (gmap positive) coPset. Proof. diff --git a/theories/fin_map_dom.v b/theories/fin_map_dom.v index c3bfa075..e17c7251 100644 --- a/theories/fin_map_dom.v +++ b/theories/fin_map_dom.v @@ -5,10 +5,9 @@ maps. We provide such an axiomatization, instead of implementing the domain function in a generic way, to allow more efficient implementations. *) From stdpp Require Export collections fin_maps. -Class FinMapDom K M D `{FMap M, - ∀ A, Lookup K A (M A), ∀ A, Empty (M A), ∀ A, PartialAlter K A (M A), - OMap M, Merge M, ∀ A, FinMapToList K A (M A), ∀ i j : K, Decision (i = j), - ∀ A, Dom (M A) D, ElemOf K D, Empty D, Singleton K D, +Class FinMapDom K M D `{FMap M, Lookup K M, ∀ A, Empty (M A), PartialAlter K M, + OMap M, Merge M, FinMapToList K M, ∀ i j : K, Decision (i = j), + Dom M D, ElemOf K D, Empty D, Singleton K D, Union D, Intersection D, Difference D} := { finmap_dom_map :>> FinMap K M; finmap_dom_collection :>> Collection K D; diff --git a/theories/fin_maps.v b/theories/fin_maps.v index da4e7f99..a0ffd1d5 100644 --- a/theories/fin_maps.v +++ b/theories/fin_maps.v @@ -23,11 +23,11 @@ prove well founded recursion on finite maps. *) which enables us to give a generic implementation of [union_with], [intersection_with], and [difference_with]. *) -Class FinMapToList K A M := map_to_list: M → list (K * A). +Class FinMapToList (K : Type) (M : Type → Type) := + map_to_list : ∀ {A}, M A → list (K * A). -Class FinMap K M `{FMap M, ∀ A, Lookup K A (M A), ∀ A, Empty (M A), ∀ A, - PartialAlter K A (M A), OMap M, Merge M, ∀ A, FinMapToList K A (M A), - ∀ i j : K, Decision (i = j)} := { +Class FinMap K M `{FMap M, Lookup K M, ∀ A, Empty (M A), PartialAlter K M, + OMap M, Merge M, FinMapToList K M, ∀ i j : K, Decision (i = j)} := { map_eq {A} (m1 m2 : M A) : (∀ i, m1 !! i = m2 !! i) → m1 = m2; lookup_empty {A} i : (∅ : M A) !! i = None; lookup_partial_alter {A} f (m : M A) i : @@ -48,47 +48,47 @@ Class FinMap K M `{FMap M, ∀ A, Lookup K A (M A), ∀ A, Empty (M A), ∀ A, finite map implementations. These generic implementations do not cause a significant performance loss to make including them in the finite map interface worthwhile. *) -Instance map_insert `{PartialAlter K A M} : Insert K A M := - λ i x, partial_alter (λ _, Some x) i. -Instance map_alter `{PartialAlter K A M} : Alter K A M := - λ f, partial_alter (fmap f). -Instance map_delete `{PartialAlter K A M} : Delete K M := - partial_alter (λ _, None). -Instance map_singleton `{PartialAlter K A M, Empty M} : - SingletonM K A M := λ i x, <[i:=x]> ∅. +Instance map_insert `{PartialAlter K M} : Insert K M := + λ A i x, partial_alter (λ _, Some x) i. +Instance map_alter `{PartialAlter K M} : Alter K M := + λ A f, partial_alter (fmap f). +Instance map_delete `{PartialAlter K M} : Delete K M := + λ A, partial_alter (λ _, None). +Instance map_singleton `{PartialAlter K M, ∀ A, Empty (M A)} : SingletonM K M := + λ A i x, <[i:=x]> ∅. -Definition map_of_list `{Insert K A M, Empty M} : list (K * A) → M := +Definition map_of_list `{Insert K M, Empty (M A)} : list (K * A) → M A := fold_right (λ p, <[p.1:=p.2]>) ∅. -Definition map_of_collection `{Elements K C, Insert K A M, Empty M} - (f : K → option A) (X : C) : M := +Definition map_of_collection `{Elements K C, Insert K M, Empty (M A)} + (f : K → option A) (X : C) : M A := map_of_list (omap (λ i, (i,) <$> f i) (elements X)). -Instance map_union_with `{Merge M} {A} : UnionWith A (M A) := - λ f, merge (union_with f). -Instance map_intersection_with `{Merge M} {A} : IntersectionWith A (M A) := - λ f, merge (intersection_with f). -Instance map_difference_with `{Merge M} {A} : DifferenceWith A (M A) := - λ f, merge (difference_with f). +Instance map_union_with `{Merge M} : UnionWith M := + λ A f, merge (union_with f). +Instance map_intersection_with `{Merge M} : IntersectionWith M := + λ A f, merge (intersection_with f). +Instance map_difference_with `{Merge M} : DifferenceWith M := + λ A f, merge (difference_with f). -Instance map_equiv `{∀ A, Lookup K A (M A), Equiv A} : Equiv (M A) | 18 := +Instance map_equiv `{Lookup K M, Equiv A} : Equiv (M A) | 18 := λ m1 m2, ∀ i, m1 !! i ≡ m2 !! i. (** The relation [intersection_forall R] on finite maps describes that the relation [R] holds for each pair in the intersection. *) -Definition map_Forall `{Lookup K A M} (P : K → A → Prop) : M → Prop := +Definition map_Forall `{Lookup K M} {A} (P : K → A → Prop) : M A → Prop := λ m, ∀ i x, m !! i = Some x → P i x. -Definition map_relation `{∀ A, Lookup K A (M A)} {A B} (R : A → B → Prop) +Definition map_relation `{Lookup K M} {A B} (R : A → B → Prop) (P : A → Prop) (Q : B → Prop) (m1 : M A) (m2 : M B) : Prop := ∀ i, option_relation R P Q (m1 !! i) (m2 !! i). -Definition map_included `{∀ A, Lookup K A (M A)} {A} +Definition map_included `{Lookup K M} {A} (R : relation A) : relation (M A) := map_relation R (λ _, False) (λ _, True). -Definition map_disjoint `{∀ A, Lookup K A (M A)} {A} : relation (M A) := +Definition map_disjoint `{Lookup K M} {A} : relation (M A) := map_relation (λ _ _, False) (λ _, True) (λ _, True). Infix "⊥ₘ" := map_disjoint (at level 70) : C_scope. Hint Extern 0 (_ ⊥ₘ _) => symmetry; eassumption. Notation "( m ⊥ₘ.)" := (map_disjoint m) (only parsing) : C_scope. Notation "(.⊥ₘ m )" := (λ m2, m2 ⊥ₘ m) (only parsing) : C_scope. -Instance map_subseteq `{∀ A, Lookup K A (M A)} {A} : SubsetEq (M A) := +Instance map_subseteq `{Lookup K M} {A} : SubsetEq (M A) := map_included (=). (** The union of two finite maps only has a meaningful definition for maps @@ -106,8 +106,8 @@ Instance map_difference `{Merge M} {A} : Difference (M A) := (** A stronger variant of map that allows the mapped function to use the index of the elements. Implemented by conversion to lists, so not very efficient. *) -Definition map_imap `{∀ A, Insert K A (M A), ∀ A, Empty (M A), - ∀ A, FinMapToList K A (M A)} {A B} (f : K → A → option B) (m : M A) : M B := +Definition map_imap `{Insert K M, ∀ A, Empty (M A), + FinMapToList K M} {A B} (f : K → A → option B) (m : M A) : M B := map_of_list (omap (λ ix, (fst ix,) <$> curry f ix) (map_to_list m)). (** * Theorems *) @@ -124,27 +124,25 @@ Section setoid. - by intros m1 m2 ? i. - by intros m1 m2 m3 ?? i; trans (m2 !! i). Qed. - Global Instance lookup_proper (i : K) : - Proper ((≡) ==> (≡)) (lookup (M:=M A) i). + Global Instance lookup_proper (i: K) : Proper ((≡) ==> (≡)) (lookup (M:=M) i). Proof. by intros m1 m2 Hm. Qed. Global Instance partial_alter_proper : - Proper (((≡) ==> (≡)) ==> (=) ==> (≡) ==> (≡)) (partial_alter (M:=M A)). + Proper (((≡) ==> (≡)) ==> (=) ==> (≡) ==> (≡)) (partial_alter (M:=M)). Proof. by intros f1 f2 Hf i ? <- m1 m2 Hm j; destruct (decide (i = j)) as [->|]; rewrite ?lookup_partial_alter, ?lookup_partial_alter_ne by done; try apply Hf; apply lookup_proper. Qed. Global Instance insert_proper (i : K) : - Proper ((≡) ==> (≡) ==> (≡)) (insert (M:=M A) i). + Proper ((≡) ==> (≡) ==> (≡)) (insert (M:=M) i). Proof. by intros ???; apply partial_alter_proper; [constructor|]. Qed. - Global Instance singleton_proper k : - Proper ((≡) ==> (≡)) (singletonM k : A → M A). + Global Instance singleton_proper (i : K) : + Proper ((≡) ==> (≡)) (singletonM (M:=M) i). Proof. by intros ???; apply insert_proper. Qed. - Global Instance delete_proper (i : K) : - Proper ((≡) ==> (≡)) (delete (M:=M A) i). + Global Instance delete_proper (i: K) : Proper ((≡) ==> (≡)) (delete (M:=M) i). Proof. by apply partial_alter_proper; [constructor|]. Qed. Global Instance alter_proper : - Proper (((≡) ==> (≡)) ==> (=) ==> (≡) ==> (≡)) (alter (A:=A) (M:=M A)). + Proper (((≡) ==> (≡)) ==> (=) ==> (≡) ==> (≡)) (alter (M:=M)). Proof. intros ?? Hf; apply partial_alter_proper. by destruct 1; constructor; apply Hf. @@ -156,7 +154,7 @@ Section setoid. by intros Hf ?? Hm1 ?? Hm2 i; rewrite !lookup_merge by done; apply Hf. Qed. Global Instance union_with_proper : - Proper (((≡) ==> (≡) ==> (≡)) ==> (≡) ==> (≡) ==>(≡)) (union_with (M:=M A)). + Proper (((≡) ==> (≡) ==> (≡)) ==> (≡) ==> (≡) ==>(≡)) (union_with (M:=M)). Proof. intros ?? Hf ?? Hm1 ?? Hm2 i; apply (merge_ext _ _); auto. by do 2 destruct 1; first [apply Hf | constructor]. diff --git a/theories/functions.v b/theories/functions.v index ebc83e2d..a34f81fe 100644 --- a/theories/functions.v +++ b/theories/functions.v @@ -2,10 +2,10 @@ From stdpp Require Export base tactics. Section definitions. Context {A T : Type} `{∀ a b : A, Decision (a = b)}. - Global Instance fn_insert : Insert A T (A → T) := - λ a t f b, if decide (a = b) then t else f b. - Global Instance fn_alter : Alter A T (A → T) := - λ (g : T → T) a f b, if decide (a = b) then g (f a) else f b. + Definition fn_insert (a : A) (t : T) (f : A → T) : A → T := λ b, + if decide (a = b) then t else f b. + Definition fn_alter (g : T → T) (a : A) (f : A → T) : A → T := λ b, + if decide (a = b) then g (f a) else f b. End definitions. (* TODO: For now, we only have the properties here that do not need a notion @@ -14,17 +14,17 @@ End definitions. Section functions. Context {A T : Type} `{∀ a b : A, Decision (a = b)}. - Lemma fn_lookup_insert (f : A → T) a t : <[a:=t]>f a = t. - Proof. unfold insert, fn_insert. by destruct (decide (a = a)). Qed. + Lemma fn_lookup_insert (f : A → T) a t : fn_insert a t f a = t. + Proof. unfold fn_insert. by destruct (decide (a = a)). Qed. Lemma fn_lookup_insert_rev (f : A → T) a t1 t2 : - <[a:=t1]>f a = t2 → t1 = t2. + fn_insert a t1 f a = t2 → t1 = t2. Proof. rewrite fn_lookup_insert. congruence. Qed. - Lemma fn_lookup_insert_ne (f : A → T) a b t : a ≠b → <[a:=t]>f b = f b. - Proof. unfold insert, fn_insert. by destruct (decide (a = b)). Qed. + Lemma fn_lookup_insert_ne (f : A → T) a b t : a ≠b → fn_insert a t f b = f b. + Proof. unfold fn_insert. by destruct (decide (a = b)). Qed. - Lemma fn_lookup_alter (g : T → T) (f : A → T) a : alter g a f a = g (f a). - Proof. unfold alter, fn_alter. by destruct (decide (a = a)). Qed. + Lemma fn_lookup_alter (g : T → T) (f : A → T) a : fn_alter g a f a = g (f a). + Proof. unfold fn_alter. by destruct (decide (a = a)). Qed. Lemma fn_lookup_alter_ne (g : T → T) (f : A → T) a b : - a ≠b → alter g a f b = f b. - Proof. unfold alter, fn_alter. by destruct (decide (a = b)). Qed. + a ≠b → fn_alter g a f b = f b. + Proof. unfold fn_alter. by destruct (decide (a = b)). Qed. End functions. diff --git a/theories/gmap.v b/theories/gmap.v index 88f62e36..aa481522 100644 --- a/theories/gmap.v +++ b/theories/gmap.v @@ -30,7 +30,7 @@ Proof. Defined. (** * Operations on the data structure *) -Instance gmap_lookup `{Countable K} {A} : Lookup K A (gmap K A) := λ i m, +Instance gmap_lookup `{Countable K} : Lookup K (gmap K) := λ A i m, let (m,_) := m in m !! encode i. Instance gmap_empty `{Countable K} {A} : Empty (gmap K A) := GMap ∅ I. Lemma gmap_partial_alter_wf `{Countable K} {A} (f : option A → option A) m i : @@ -40,8 +40,7 @@ Proof. - rewrite decode_encode; eauto. - rewrite lookup_partial_alter_ne by done. by apply Hm. Qed. -Instance gmap_partial_alter `{Countable K} {A} : - PartialAlter K A (gmap K A) := λ f i m, +Instance gmap_partial_alter `{Countable K} : PartialAlter K (gmap K) := λ A f i m, let (m,Hm) := m in GMap (partial_alter f (encode i) m) (bool_decide_pack _ (gmap_partial_alter_wf f m i (bool_decide_unpack _ Hm))). @@ -70,7 +69,7 @@ Instance gmap_merge `{Countable K} : Merge (gmap K) := λ A B C f m1 m2, let f' o1 o2 := match o1, o2 with None, None => None | _, _ => f o1 o2 end in GMap (merge f' m1 m2) (bool_decide_pack _ (gmap_merge_wf f _ _ (bool_decide_unpack _ Hm1) (bool_decide_unpack _ Hm2))). -Instance gmap_to_list `{Countable K} {A} : FinMapToList K A (gmap K A) := λ m, +Instance gmap_to_list `{Countable K} : FinMapToList K (gmap K) := λ A m, let (m,_) := m in omap (λ ix : positive * A, let (i,x) := ix in (,x) <$> decode i) (map_to_list m). @@ -114,7 +113,7 @@ Qed. (** * Finite sets *) Notation gset K := (mapset (gmap K)). -Instance gset_dom `{Countable K} {A} : Dom (gmap K A) (gset K) := mapset_dom. +Instance gset_dom `{Countable K} : Dom (gmap K) (gset K) := mapset_dom. Instance gset_dom_spec `{Countable K} : FinMapDom K (gmap K) (gset K) := mapset_dom_spec. diff --git a/theories/list.v b/theories/list.v index 59b7bda9..2608cebf 100644 --- a/theories/list.v +++ b/theories/list.v @@ -57,15 +57,15 @@ Existing Instance list_equiv. (** The operation [l !! i] gives the [i]th element of the list [l], or [None] in case [i] is out of bounds. *) -Instance list_lookup {A} : Lookup nat A (list A) := - fix go i l {struct l} : option A := let _ : Lookup _ _ _ := @go in +Instance list_lookup : Lookup nat list := + fix go A i l {struct l} : option A := let _ : Lookup _ _ := @go in match l with | [] => None | x :: l => match i with 0 => Some x | S i => l !! i end end. (** The operation [alter f i l] applies the function [f] to the [i]th element of [l]. In case [i] is out of bounds, the list is returned unchanged. *) -Instance list_alter {A} : Alter nat A (list A) := λ f, +Instance list_alter : Alter nat list := λ A f, fix go i l {struct l} := match l with | [] => [] @@ -74,8 +74,8 @@ Instance list_alter {A} : Alter nat A (list A) := λ f, (** The operation [<[i:=x]> l] overwrites the element at position [i] with the value [x]. In case [i] is out of bounds, the list is returned unchanged. *) -Instance list_insert {A} : Insert nat A (list A) := - fix go i y l {struct l} := let _ : Insert _ _ _ := @go in +Instance list_insert : Insert nat list := + fix go A i y l {struct l} := let _ : Insert _ _ := @go in match l with | [] => [] | x :: l => match i with 0 => y :: l | S i => x :: <[i:=y]>l end @@ -90,11 +90,11 @@ Instance: Params (@list_inserts) 1. (** The operation [delete i l] removes the [i]th element of [l] and moves all consecutive elements one position ahead. In case [i] is out of bounds, the list is returned unchanged. *) -Instance list_delete {A} : Delete nat (list A) := - fix go (i : nat) (l : list A) {struct l} : list A := +Instance list_delete : Delete nat list := + fix go A (i : nat) (l : list A) {struct l} : list A := match l with | [] => [] - | x :: l => match i with 0 => l | S i => x :: @delete _ _ go i l end + | x :: l => match i with 0 => l | S i => x :: @delete _ _ go _ i l end end. (** The function [option_list o] converts an element [Some x] into the @@ -2733,13 +2733,13 @@ Section setoid. Global Instance drop_proper n : Proper ((≡) ==> (≡)) (@drop A n). Proof. induction n; destruct 1; simpl; try constructor; auto. Qed. Global Instance list_lookup_proper i : - Proper ((≡) ==> (≡)) (lookup (M:=list A) i). + Proper ((≡) ==> (≡)) (lookup (M:=list) i). Proof. induction i; destruct 1; simpl; f_equiv; auto. Qed. Global Instance list_alter_proper f i : - Proper ((≡) ==> (≡)) f → Proper ((≡) ==> (≡)) (alter (M:=list A) f i). + Proper ((≡) ==> (≡)) f → Proper ((≡) ==> (≡)) (alter (M:=list) f i). Proof. intros. induction i; destruct 1; constructor; eauto. Qed. Global Instance list_insert_proper i : - Proper ((≡) ==> (≡) ==> (≡)) (insert (M:=list A) i). + Proper ((≡) ==> (≡) ==> (≡)) (insert (M:=list) i). Proof. intros ???; induction i; destruct 1; constructor; eauto. Qed. Global Instance list_inserts_proper i : Proper ((≡) ==> (≡) ==> (≡)) (@list_inserts A i). @@ -2748,7 +2748,7 @@ Section setoid. induction Hk; intros ????; simpl; try f_equiv; naive_solver. Qed. Global Instance list_delete_proper i : - Proper ((≡) ==> (≡)) (delete (M:=list A) i). + Proper ((≡) ==> (≡)) (delete (M:=list) i). Proof. induction i; destruct 1; try constructor; eauto. Qed. Global Instance option_list_proper : Proper ((≡) ==> (≡)) (@option_list A). Proof. destruct 1; by constructor. Qed. diff --git a/theories/mapset.v b/theories/mapset.v index b75e6140..2ecdf0e2 100644 --- a/theories/mapset.v +++ b/theories/mapset.v @@ -118,7 +118,7 @@ Proof. - destruct (Is_true_reflect (f a)); naive_solver. - naive_solver. Qed. -Instance mapset_dom {A} : Dom (M A) (mapset M) := mapset_dom_with (λ _, true). +Instance mapset_dom : Dom M (mapset M) := λ A, mapset_dom_with (λ _, true). Instance mapset_dom_spec: FinMapDom K M (mapset M). Proof. split; try apply _. intros. unfold dom, mapset_dom, is_Some. diff --git a/theories/natmap.v b/theories/natmap.v index 9c7e8995..600fbce1 100644 --- a/theories/natmap.v +++ b/theories/natmap.v @@ -44,7 +44,7 @@ Global Instance natmap_eq_dec `{∀ x y : A, Decision (x = y)} end. Instance natmap_empty {A} : Empty (natmap A) := NatMap [] I. -Instance natmap_lookup {A} : Lookup nat A (natmap A) := λ i m, +Instance natmap_lookup : Lookup nat natmap := λ A i m, let (l,_) := m in mjoin (l !! i). Fixpoint natmap_singleton_raw {A} (i : nat) (x : A) : natmap_raw A := @@ -92,7 +92,7 @@ Proof. revert i. induction l; [intro | intros [|?]]; simpl; repeat case_match; eauto using natmap_singleton_wf, natmap_cons_canon_wf, natmap_wf_inv. Qed. -Instance natmap_alter {A} : PartialAlter nat A (natmap A) := λ f i m, +Instance natmap_alter : PartialAlter nat natmap := λ A f i m, let (l,Hl) := m in NatMap _ (natmap_alter_wf f i l Hl). Lemma natmap_lookup_alter_raw {A} (f : option A → option A) i l : mjoin (natmap_alter_raw f i l !! i) = f (mjoin (l !! i)). @@ -188,7 +188,7 @@ Proof. revert i. induction l as [|[?|] ? IH]; simpl; try constructor; auto. rewrite natmap_elem_of_to_list_raw_aux. intros (?&?&?). lia. Qed. -Instance natmap_to_list {A} : FinMapToList nat A (natmap A) := λ m, +Instance natmap_to_list : FinMapToList nat natmap := λ A m, let (l,_) := m in natmap_to_list_raw 0 l. Definition natmap_map_raw {A B} (f : A → B) : natmap_raw A → natmap_raw B := @@ -256,7 +256,7 @@ Qed. (** Finally, we can construct sets of [nat]s satisfying extensional equality. *) Notation natset := (mapset natmap). -Instance natmap_dom {A} : Dom (natmap A) natset := mapset_dom. +Instance natmap_dom : Dom natmap natset := mapset_dom. Instance: FinMapDom nat natmap natset := mapset_dom_spec. (* Fixpoint avoids this definition from being unfolded *) diff --git a/theories/nmap.v b/theories/nmap.v index c839a659..9d56d9c8 100644 --- a/theories/nmap.v +++ b/theories/nmap.v @@ -22,17 +22,17 @@ Proof. Defined. Instance Nempty {A} : Empty (Nmap A) := NMap None ∅. Global Opaque Nempty. -Instance Nlookup {A} : Lookup N A (Nmap A) := λ i t, +Instance Nlookup : Lookup N Nmap := λ A i t, match i with | N0 => Nmap_0 t | Npos p => Nmap_pos t !! p end. -Instance Npartial_alter {A} : PartialAlter N A (Nmap A) := λ f i t, +Instance Npartial_alter : PartialAlter N Nmap := λ A f i t, match i, t with | N0, NMap o t => NMap (f o) t | Npos p, NMap o t => NMap o (partial_alter f p t) end. -Instance Nto_list {A} : FinMapToList N A (Nmap A) := λ t, +Instance Nto_list : FinMapToList N Nmap := λ A t, match t with | NMap o t => default [] o (λ x, [(0,x)]) ++ (prod_map Npos id <$> map_to_list t) @@ -82,7 +82,7 @@ Qed. (** * Finite sets *) (** We construct sets of [N]s satisfying extensional equality. *) Notation Nset := (mapset Nmap). -Instance Nmap_dom {A} : Dom (Nmap A) Nset := mapset_dom. +Instance Nmap_dom : Dom Nmap Nset := mapset_dom. Instance: FinMapDom N Nmap Nset := mapset_dom_spec. (** * Fresh numbers *) diff --git a/theories/option.v b/theories/option.v index 5af4b5a0..cefc6668 100644 --- a/theories/option.v +++ b/theories/option.v @@ -239,16 +239,16 @@ Instance maybe_Some {A} : Maybe (@Some A) := id. Arguments maybe_Some _ !_ /. (** * Union, intersection and difference *) -Instance option_union_with {A} : UnionWith A (option A) := λ f mx my, +Instance option_union_with : UnionWith option := λ A f mx my, match mx, my with | Some x, Some y => f x y | Some x, None => Some x | None, Some y => Some y | None, None => None end. -Instance option_intersection_with {A} : IntersectionWith A (option A) := - λ f mx my, match mx, my with Some x, Some y => f x y | _, _ => None end. -Instance option_difference_with {A} : DifferenceWith A (option A) := λ f mx my, +Instance option_intersection_with : IntersectionWith option := λ A f mx my, + match mx, my with Some x, Some y => f x y | _, _ => None end. +Instance option_difference_with : DifferenceWith option := λ A f mx my, match mx, my with | Some x, Some y => f x y | Some x, None => Some x diff --git a/theories/pmap.v b/theories/pmap.v index 38ee6226..5dcfcafe 100644 --- a/theories/pmap.v +++ b/theories/pmap.v @@ -52,9 +52,9 @@ Local Hint Resolve PNode_wf. (** Operations *) Instance Pempty_raw {A} : Empty (Pmap_raw A) := PLeaf. -Instance Plookup_raw {A} : Lookup positive A (Pmap_raw A) := - fix go (i : positive) (t : Pmap_raw A) {struct t} : option A := - let _ : Lookup _ _ _ := @go in +Instance Plookup_raw : Lookup positive Pmap_raw := + fix go A (i : positive) (t : Pmap_raw A) {struct t} : option A := + let _ : Lookup _ _ := @go in match t with | PLeaf => None | PNode o l r => match i with 1 => o | i~0 => l !! i | i~1 => r !! i end @@ -273,12 +273,12 @@ Instance Pmap_eq_dec `{∀ x y : A, Decision (x = y)} | right H => right (H ∘ proj1 (Pmap_eq m1 m2)) end. Instance Pempty {A} : Empty (Pmap A) := PMap ∅ I. -Instance Plookup {A} : Lookup positive A (Pmap A) := λ i m, pmap_car m !! i. -Instance Ppartial_alter {A} : PartialAlter positive A (Pmap A) := λ f i m, +Instance Plookup : Lookup positive Pmap := λ A i m, pmap_car m !! i. +Instance Ppartial_alter : PartialAlter positive Pmap := λ A f i m, let (t,Ht) := m in PMap (partial_alter f i t) (Ppartial_alter_wf f i _ Ht). Instance Pfmap : FMap Pmap := λ A B f m, let (t,Ht) := m in PMap (f <$> t) (Pfmap_wf f _ Ht). -Instance Pto_list {A} : FinMapToList positive A (Pmap A) := λ m, +Instance Pto_list : FinMapToList positive Pmap := λ A m, let (t,Ht) := m in Pto_list_raw 1 t []. Instance Pomap : OMap Pmap := λ A B f m, let (t,Ht) := m in PMap (omap f t) (Pomap_wf f _ Ht). @@ -305,7 +305,7 @@ Qed. (** * Finite sets *) (** We construct sets of [positives]s satisfying extensional equality. *) Notation Pset := (mapset Pmap). -Instance Pmap_dom {A} : Dom (Pmap A) Pset := mapset_dom. +Instance Pmap_dom : Dom Pmap Pset := mapset_dom. Instance: FinMapDom positive Pmap Pset := mapset_dom_spec. (** * Fresh numbers *) diff --git a/theories/zmap.v b/theories/zmap.v index a0644bfa..7ead0d02 100644 --- a/theories/zmap.v +++ b/theories/zmap.v @@ -23,17 +23,17 @@ Proof. end; abstract congruence. Defined. Instance Zempty {A} : Empty (Zmap A) := ZMap None ∅ ∅. -Instance Zlookup {A} : Lookup Z A (Zmap A) := λ i t, +Instance Zlookup : Lookup Z Zmap := λ A i t, match i with | Z0 => Zmap_0 t | Zpos p => Zmap_pos t !! p | Zneg p => Zmap_neg t !! p end. -Instance Zpartial_alter {A} : PartialAlter Z A (Zmap A) := λ f i t, +Instance Zpartial_alter : PartialAlter Z Zmap := λ A f i t, match i, t with | Z0, ZMap o t t' => ZMap (f o) t t' | Zpos p, ZMap o t t' => ZMap o (partial_alter f p t) t' | Zneg p, ZMap o t t' => ZMap o t (partial_alter f p t') end. -Instance Zto_list {A} : FinMapToList Z A (Zmap A) := λ t, +Instance Zto_list : FinMapToList Z Zmap := λ A t, match t with | ZMap o t t' => default [] o (λ x, [(0,x)]) ++ (prod_map Zpos id <$> map_to_list t) ++ @@ -93,5 +93,5 @@ Qed. (** * Finite sets *) (** We construct sets of [Z]s satisfying extensional equality. *) Notation Zset := (mapset Zmap). -Instance Zmap_dom {A} : Dom (Zmap A) Zset := mapset_dom. +Instance Zmap_dom : Dom Zmap Zset := mapset_dom. Instance: FinMapDom Z Zmap Zset := mapset_dom_spec. -- GitLab