Skip to content

Commit 65ad789

Browse files
committed
Add setoid and respectful instances
1 parent 231c378 commit 65ad789

3 files changed

Lines changed: 65 additions & 5 deletions

File tree

.github/workflows/coqchk.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
strategy:
99
matrix:
1010
coq_version:
11-
- '8.17'
11+
- '8.20'
1212
ocaml_version: ['default']
1313
fail-fast: true # don't stop jobs if one fails
1414
steps:

coq-libtx-storage.opam

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ build: [
1414
]
1515
install: [make "install"]
1616
depends: [
17-
"coq" {(>= "8.11" & < "8.18~") | (= "dev")}
17+
"coq" {(>= "8.19") | (= "dev")}
1818
"coq-record-update" {(>= "0.3" & < "0.4~")}
1919
"coq-hammer"
2020
]

theories/Storage/Classes.v

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
From Coq Require Import
22
List
3-
Classes.EquivDec.
3+
Classes.EquivDec
4+
Classes.SetoidClass.
45

56
Section defns.
67
Context {K V : Type}.
@@ -53,16 +54,75 @@ Section Operations.
5354
Defined.
5455
End Operations.
5556

56-
Section Equivalence.
57+
Section EquivalenceOfDistinctStorages.
5758
Context {K V} {T1 T2} `{@Storage K V T1, Storage K V T2}.
5859

5960
Inductive s_eq (s1 : T1) (s2 : T2) :=
6061
| s_eq_ : (forall k, get k s1 = get k s2) -> s_eq s1 s2.
61-
End Equivalence.
62+
End EquivalenceOfDistinctStorages.
6263

6364
Notation "s1 =s= s2" := (s_eq s1 s2) (at level 50).
6465
#[export] Hint Constructors s_eq : storage.
6566

67+
Section Setoid.
68+
Context `{Hstorage : Storage}.
69+
70+
Global Instance s_eq_refl : Reflexive s_eq.
71+
Proof.
72+
intros x. constructor. intros k.
73+
reflexivity.
74+
Qed.
75+
76+
Global Instance s_eq_symmetry : Symmetric s_eq.
77+
Proof.
78+
intros x y H. constructor. intros k.
79+
destruct H as [H].
80+
now rewrite H.
81+
Qed.
82+
83+
Global Instance s_eq_transitive : Transitive s_eq.
84+
Proof.
85+
intros x y z Hxy Hyz. constructor. intros k.
86+
destruct Hxy as [Hxy]. destruct Hyz as [Hyz].
87+
now rewrite Hxy, Hyz.
88+
Qed.
89+
90+
Global Instance s_eq_equiv : Equivalence s_eq :=
91+
{|
92+
Equivalence_Reflexive := s_eq_refl;
93+
Equivalence_Symmetric := s_eq_symmetry;
94+
Equivalence_Transitive := s_eq_transitive;
95+
|}.
96+
97+
Global Instance s_eq_setiod : Setoid t :=
98+
{|
99+
equiv := s_eq;
100+
setoid_equiv := s_eq_equiv;
101+
|}.
102+
End Setoid.
103+
104+
Add Parametric Morphism {K V} t `{H : @Storage K V t} `{Hkdec : EqDec K eq} : (@put K V t H) with
105+
signature (@eq K) ==> (@eq V) ==> (@s_eq K V t t H H) ==> (@s_eq K V t t H H) as put_mor.
106+
Proof.
107+
intros k v s1 s2 Hs.
108+
destruct Hs as [Hs].
109+
constructor. intros k_.
110+
destruct (equiv_dec k k_) as [Heq | Hneq].
111+
- rewrite Heq. now repeat rewrite keep.
112+
- repeat rewrite <- distinct; auto.
113+
Qed.
114+
115+
Add Parametric Morphism {K V} t `{H : @Storage K V t} `{Hkdec : EqDec K eq} : (@delete K V t H) with
116+
signature (@eq K) ==> (@s_eq K V t t H H) ==> (@s_eq K V t t H H) as delete_mor.
117+
Proof.
118+
intros k s1 s2 Hs.
119+
destruct Hs as [Hs].
120+
constructor. intros k_.
121+
destruct (equiv_dec k k_) as [Heq | Hneq].
122+
- rewrite Heq. now repeat rewrite delete_keep.
123+
- repeat rewrite <- delete_distinct; auto.
124+
Qed.
125+
66126
Section WriteLog.
67127
Context {K V : Type} `{HKeq_dec : EqDec K eq} {T} `{HT_Storage : @Storage K V T}.
68128

0 commit comments

Comments
 (0)