Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Marianna Rapoport
iris-coq
Commits
070a85d9
Commit
070a85d9
authored
Jan 05, 2017
by
Robbert Krebbers
Browse files
Tweak some proof using tweaks for setoid stuff.
parent
6bbc6b49
Changes
3
Hide whitespace changes
Inline
Side-by-side
theories/prelude/fin_maps.v
View file @
070a85d9
...
...
@@ -119,13 +119,13 @@ Context `{FinMap K M}.
(** ** Setoids *)
Section
setoid
.
Context
`
{
Equiv
A
}.
Lemma
map_equiv_lookup_l
(
m1
m2
:
M
A
)
i
x
:
m1
≡
m2
→
m1
!!
i
=
Some
x
→
∃
y
,
m2
!!
i
=
Some
y
∧
x
≡
y
.
Proof
.
generalize
(
equiv_Some_inv_l
(
m1
!!
i
)
(
m2
!!
i
)
x
)
;
naive_solver
.
Qed
.
Context
`
{!
Equivalence
((
≡
)
:
relation
A
)}.
Global
Instance
map_equivalence
:
Equivalence
((
≡
)
:
relation
(
M
A
)).
Global
Instance
map_equivalence
:
Equivalence
((
≡
)
:
relation
A
)
→
Equivalence
((
≡
)
:
relation
(
M
A
)).
Proof
.
split
.
-
by
intros
m
i
.
...
...
@@ -147,7 +147,10 @@ Section setoid.
Proof
.
by
intros
???
;
apply
partial_alter_proper
;
[
constructor
|].
Qed
.
Global
Instance
singleton_proper
k
:
Proper
((
≡
)
==>
(
≡
))
(
singletonM
k
:
A
→
M
A
).
Proof
.
by
intros
???
;
apply
insert_proper
.
Qed
.
Proof
.
intros
???
;
apply
insert_proper
;
[
done
|].
intros
?.
rewrite
lookup_empty
;
constructor
.
Qed
.
Global
Instance
delete_proper
(
i
:
K
)
:
Proper
((
≡
)
==>
(
≡
))
(
delete
(
M
:
=
M
A
)
i
).
Proof
.
by
apply
partial_alter_proper
;
[
constructor
|].
Qed
.
...
...
@@ -170,14 +173,12 @@ Section setoid.
by
do
2
destruct
1
;
first
[
apply
Hf
|
constructor
].
Qed
.
Global
Instance
map_leibniz
`
{!
LeibnizEquiv
A
}
:
LeibnizEquiv
(
M
A
).
Proof
.
intros
m1
m2
Hm
;
apply
map_eq
;
intros
i
.
by
unfold_leibniz
;
apply
lookup_proper
.
Qed
.
Proof
.
intros
m1
m2
Hm
;
apply
map_eq
;
intros
i
.
apply
leibniz_equiv
,
Hm
.
Qed
.
Lemma
map_equiv_empty
(
m
:
M
A
)
:
m
≡
∅
↔
m
=
∅
.
Proof
.
split
;
[
intros
Hm
;
apply
map_eq
;
intros
i
|
by
intros
->].
by
rewrite
lookup_empty
,
<-
equiv_None
,
Hm
,
lookup_empty
.
split
;
[
intros
Hm
;
apply
map_eq
;
intros
i
|
intros
->].
-
generalize
(
Hm
i
).
by
rewrite
lookup_empty
,
equiv_None
.
-
intros
?.
rewrite
lookup_empty
;
constructor
.
Qed
.
Global
Instance
map_fmap_proper
`
{
Equiv
B
}
(
f
:
A
→
B
)
:
Proper
((
≡
)
==>
(
≡
))
f
→
Proper
((
≡
)
==>
(
≡
))
(
fmap
(
M
:
=
M
)
f
).
...
...
theories/prelude/list.v
View file @
070a85d9
...
...
@@ -2753,9 +2753,8 @@ Section setoid.
by
setoid_rewrite
equiv_option_Forall2
.
Qed
.
Context
{
Hequiv
:
Equivalence
((
≡
)
:
relation
A
)}.
Global
Instance
list_equivalence
:
Equivalence
((
≡
)
:
relation
(
list
A
)).
Global
Instance
list_equivalence
:
Equivalence
((
≡
)
:
relation
A
)
→
Equivalence
((
≡
)
:
relation
(
list
A
)).
Proof
.
split
.
-
intros
l
.
by
apply
equiv_Forall2
.
...
...
@@ -2766,48 +2765,53 @@ Section setoid.
Proof
.
induction
1
;
f_equal
;
fold_leibniz
;
auto
.
Qed
.
Global
Instance
cons_proper
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(@
cons
A
).
Proof
using
-(
Hequiv
)
.
by
constructor
.
Qed
.
Proof
.
by
constructor
.
Qed
.
Global
Instance
app_proper
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(@
app
A
).
Proof
using
-(
Hequiv
)
.
induction
1
;
intros
???
;
simpl
;
try
constructor
;
auto
.
Qed
.
Proof
.
induction
1
;
intros
???
;
simpl
;
try
constructor
;
auto
.
Qed
.
Global
Instance
length_proper
:
Proper
((
≡
)
==>
(=))
(@
length
A
).
Proof
using
-(
Hequiv
)
.
induction
1
;
f_equal
/=
;
auto
.
Qed
.
Proof
.
induction
1
;
f_equal
/=
;
auto
.
Qed
.
Global
Instance
tail_proper
:
Proper
((
≡
)
==>
(
≡
))
(@
tail
A
).
Proof
.
by
destruct
1
.
Qed
.
Proof
.
destruct
1
;
try
constructor
;
auto
.
Qed
.
Global
Instance
take_proper
n
:
Proper
((
≡
)
==>
(
≡
))
(@
take
A
n
).
Proof
using
-(
Hequiv
)
.
induction
n
;
destruct
1
;
constructor
;
auto
.
Qed
.
Proof
.
induction
n
;
destruct
1
;
constructor
;
auto
.
Qed
.
Global
Instance
drop_proper
n
:
Proper
((
≡
)
==>
(
≡
))
(@
drop
A
n
).
Proof
using
-(
Hequiv
)
.
induction
n
;
destruct
1
;
simpl
;
try
constructor
;
auto
.
Qed
.
Proof
.
induction
n
;
destruct
1
;
simpl
;
try
constructor
;
auto
.
Qed
.
Global
Instance
list_lookup_proper
i
:
Proper
((
≡
)
==>
(
≡
))
(
lookup
(
M
:
=
list
A
)
i
).
Proof
.
induction
i
;
destruct
1
;
simpl
;
f_equiv
;
auto
.
Qed
.
Proof
.
induction
i
;
destruct
1
;
simpl
;
try
constructor
;
auto
.
Qed
.
Global
Instance
list_alter_proper
f
i
:
Proper
((
≡
)
==>
(
≡
))
f
→
Proper
((
≡
)
==>
(
≡
))
(
alter
(
M
:
=
list
A
)
f
i
).
Proof
using
-(
Hequiv
)
.
intros
.
induction
i
;
destruct
1
;
constructor
;
eauto
.
Qed
.
Proof
.
intros
.
induction
i
;
destruct
1
;
constructor
;
eauto
.
Qed
.
Global
Instance
list_insert_proper
i
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(
insert
(
M
:
=
list
A
)
i
).
Proof
using
-(
Hequiv
)
.
intros
???
;
induction
i
;
destruct
1
;
constructor
;
eauto
.
Qed
.
Proof
.
intros
???
;
induction
i
;
destruct
1
;
constructor
;
eauto
.
Qed
.
Global
Instance
list_inserts_proper
i
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(@
list_inserts
A
i
).
Proof
using
-(
Hequiv
)
.
Proof
.
intros
k1
k2
Hk
;
revert
i
.
induction
Hk
;
intros
????
;
simpl
;
try
f_equiv
;
naive_solver
.
Qed
.
Global
Instance
list_delete_proper
i
:
Proper
((
≡
)
==>
(
≡
))
(
delete
(
M
:
=
list
A
)
i
).
Proof
using
-(
Hequiv
)
.
induction
i
;
destruct
1
;
try
constructor
;
eauto
.
Qed
.
Proof
.
induction
i
;
destruct
1
;
try
constructor
;
eauto
.
Qed
.
Global
Instance
option_list_proper
:
Proper
((
≡
)
==>
(
≡
))
(@
option_list
A
).
Proof
.
destruct
1
;
by
constructor
.
Qed
.
Proof
.
destruct
1
;
repeat
constructor
;
auto
.
Qed
.
Global
Instance
list_filter_proper
P
`
{
∀
x
,
Decision
(
P
x
)}
:
Proper
((
≡
)
==>
iff
)
P
→
Proper
((
≡
)
==>
(
≡
))
(
filter
(
B
:
=
list
A
)
P
).
Proof
using
-(
Hequiv
)
.
intros
???.
rewrite
!
equiv_Forall2
.
by
apply
Forall2_filter
.
Qed
.
Proof
.
intros
???.
rewrite
!
equiv_Forall2
.
by
apply
Forall2_filter
.
Qed
.
Global
Instance
replicate_proper
n
:
Proper
((
≡
)
==>
(
≡
))
(@
replicate
A
n
).
Proof
using
-(
Hequiv
)
.
induction
n
;
constructor
;
auto
.
Qed
.
Proof
.
induction
n
;
constructor
;
auto
.
Qed
.
Global
Instance
reverse_proper
:
Proper
((
≡
)
==>
(
≡
))
(@
reverse
A
).
Proof
.
induction
1
;
rewrite
?reverse_cons
;
repeat
(
done
||
f_equiv
).
Qed
.
Proof
.
induction
1
;
rewrite
?reverse_cons
;
simpl
;
[
constructor
|].
apply
app_proper
;
repeat
constructor
;
auto
.
Qed
.
Global
Instance
last_proper
:
Proper
((
≡
)
==>
(
≡
))
(@
last
A
).
Proof
.
induction
1
as
[|?????
[]]
;
simpl
;
repeat
(
done
||
f_equiv
)
.
Qed
.
Proof
.
induction
1
as
[|?????
[]]
;
simpl
;
repeat
constructor
;
auto
.
Qed
.
Global
Instance
resize_proper
n
:
Proper
((
≡
)
==>
(
≡
)
==>
(
≡
))
(@
resize
A
n
).
Proof
.
induction
n
;
destruct
2
;
simpl
;
repeat
(
auto
||
f_equiv
).
Qed
.
Proof
.
induction
n
;
destruct
2
;
simpl
;
repeat
(
constructor
||
f_equiv
)
;
auto
.
Qed
.
End
setoid
.
(** * Properties of the monadic operations *)
...
...
theories/prelude/option.v
View file @
070a85d9
...
...
@@ -115,36 +115,38 @@ End Forall2.
Instance
option_equiv
`
{
Equiv
A
}
:
Equiv
(
option
A
)
:
=
option_Forall2
(
≡
).
Section
setoids
.
Context
`
{
Equiv
A
}
{
Hequiv
:
Equivalence
((
≡
)
:
relation
A
)}
.
Context
`
{
Equiv
A
}.
Implicit
Types
mx
my
:
option
A
.
Lemma
equiv_option_Forall2
mx
my
:
mx
≡
my
↔
option_Forall2
(
≡
)
mx
my
.
Proof
using
-(
Hequiv
)
.
done
.
Qed
.
Proof
.
done
.
Qed
.
Global
Instance
option_equivalence
:
Equivalence
((
≡
)
:
relation
(
option
A
)).
Global
Instance
option_equivalence
:
Equivalence
((
≡
)
:
relation
A
)
→
Equivalence
((
≡
)
:
relation
(
option
A
)).
Proof
.
apply
_
.
Qed
.
Global
Instance
Some_proper
:
Proper
((
≡
)
==>
(
≡
))
(@
Some
A
).
Proof
using
-(
Hequiv
)
.
by
constructor
.
Qed
.
Proof
.
by
constructor
.
Qed
.
Global
Instance
Some_equiv_inj
:
Inj
(
≡
)
(
≡
)
(@
Some
A
).
Proof
using
-(
Hequiv
)
.
by
inversion_clear
1
.
Qed
.
Proof
.
by
inversion_clear
1
.
Qed
.
Global
Instance
option_leibniz
`
{!
LeibnizEquiv
A
}
:
LeibnizEquiv
(
option
A
).
Proof
.
intros
x
y
;
destruct
1
;
f
old_leibniz
;
congruence
.
Qed
.
Proof
.
intros
x
y
;
destruct
1
;
f
_equal
;
by
apply
leibniz_equiv
.
Qed
.
Lemma
equiv_None
mx
:
mx
≡
None
↔
mx
=
None
.
Proof
.
split
;
[
by
inversion_clear
1
|
by
intros
->].
Qed
.
Proof
.
split
;
[
by
inversion_clear
1
|
intros
->
;
constructor
].
Qed
.
Lemma
equiv_Some_inv_l
mx
my
x
:
mx
≡
my
→
mx
=
Some
x
→
∃
y
,
my
=
Some
y
∧
x
≡
y
.
Proof
using
-(
Hequiv
)
.
destruct
1
;
naive_solver
.
Qed
.
Proof
.
destruct
1
;
naive_solver
.
Qed
.
Lemma
equiv_Some_inv_r
mx
my
y
:
mx
≡
my
→
my
=
Some
y
→
∃
x
,
mx
=
Some
x
∧
x
≡
y
.
Proof
using
-(
Hequiv
)
.
destruct
1
;
naive_solver
.
Qed
.
Proof
.
destruct
1
;
naive_solver
.
Qed
.
Lemma
equiv_Some_inv_l'
my
x
:
Some
x
≡
my
→
∃
x'
,
Some
x'
=
my
∧
x
≡
x'
.
Proof
using
-(
Hequiv
).
intros
?%(
equiv_Some_inv_l
_
_
x
)
;
naive_solver
.
Qed
.
Lemma
equiv_Some_inv_r'
mx
y
:
mx
≡
Some
y
→
∃
y'
,
mx
=
Some
y'
∧
y
≡
y'
.
Proof
.
intros
?%(
equiv_Some_inv_l
_
_
x
)
;
naive_solver
.
Qed
.
Lemma
equiv_Some_inv_r'
`
{!
Equivalence
((
≡
)
:
relation
A
)}
mx
y
:
mx
≡
Some
y
→
∃
y'
,
mx
=
Some
y'
∧
y
≡
y'
.
Proof
.
intros
?%(
equiv_Some_inv_r
_
_
y
)
;
naive_solver
.
Qed
.
Global
Instance
is_Some_proper
:
Proper
((
≡
)
==>
iff
)
(@
is_Some
A
).
Proof
using
-(
Hequiv
)
.
inversion_clear
1
;
split
;
eauto
.
Qed
.
Proof
.
inversion_clear
1
;
split
;
eauto
.
Qed
.
Global
Instance
from_option_proper
{
B
}
(
R
:
relation
B
)
(
f
:
A
→
B
)
:
Proper
((
≡
)
==>
R
)
f
→
Proper
(
R
==>
(
≡
)
==>
R
)
(
from_option
f
).
Proof
.
destruct
3
;
simpl
;
auto
.
Qed
.
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment