Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
stdpp
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Monitor
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Iris
stdpp
Merge requests
!382
Preimage function for finite maps.
Code
Review changes
Check out branch
Download
Patches
Plain diff
Merged
Preimage function for finite maps.
robbert/preimage
into
master
Overview
18
Commits
8
Pipelines
9
Changes
2
Merged
Robbert Krebbers
requested to merge
robbert/preimage
into
master
2 years ago
Overview
13
Commits
8
Pipelines
9
Changes
2
Expand
This is a possible solution to
#140
0
0
Merge request reports
Compare
master
version 8
58458a53
2 years ago
version 7
98723b1c
2 years ago
version 6
994462dc
2 years ago
version 5
13ddd3df
2 years ago
version 4
7e3c3726
2 years ago
version 3
e8fba56e
2 years ago
version 2
20327294
2 years ago
version 1
aa7254cf
2 years ago
master (base)
and
latest version
latest version
28af1927
8 commits,
2 years ago
version 8
58458a53
7 commits,
2 years ago
version 7
98723b1c
6 commits,
2 years ago
version 6
994462dc
3 commits,
2 years ago
version 5
13ddd3df
2 commits,
2 years ago
version 4
7e3c3726
2 commits,
2 years ago
version 3
e8fba56e
2 commits,
2 years ago
version 2
20327294
2 commits,
2 years ago
version 1
aa7254cf
1 commit,
2 years ago
2 files
+
104
−
0
Inline
Compare changes
Side-by-side
Inline
Show whitespace changes
Show one file at a time
Files
2
Search (e.g. *.vue) (Ctrl+P)
theories/fin_maps.v
+
103
−
0
Options
@@ -168,6 +168,17 @@ Global Instance map_lookup_total `{!Lookup K A (M A), !Inhabited A} :
LookupTotal
K
A
(
M
A
)
|
20
:=
λ
i
m
,
default
inhabitant
(
m
!!
i
)
.
Typeclasses
Opaque
map_lookup_total
.
(** Given a finite map [m] with keys [K] and values [A], the preimage
[map_preimage m] gives a finite map with keys [A] and values being sets of [K].
The type of [map_preimage] is very generic to support different map and set
implementations. A possible instance is [MKA:=gmap K A], [MASK:=gmap A (gset K)],
and [SK:=gset K]. *)
Definition
map_preimage
`{
FinMapToList
K
A
MKA
,
Empty
MASK
,
PartialAlter
A
SK
MASK
,
Empty
SK
,
Singleton
K
SK
,
Union
SK
}
(
m
:
MKA
)
:
MASK
:=
map_fold
(
λ
i
,
partial_alter
(
λ
mX
,
Some
$
{[
i
]}
∪
default
∅
mX
))
∅
m
.
Typeclasses
Opaque
map_preimage
.
(** * Theorems *)
Section
theorems
.
Context
`{
FinMap
K
M
}
.
@@ -3264,6 +3275,98 @@ Section kmap.
Proof
.
unfold
strict
.
by
rewrite
!
map_disjoint_subseteq
.
Qed
.
End
kmap
.
Section
preimage
.
(** We restrict the theory to finite sets with Leibniz equality, which is
sufficient for [gset], but not for [boolset] or [propset]. The result of the
pre-image is a map of sets. To support general sets, we would need setoid
equality on sets, and thus setoid equality on maps. *)
Context
`{
FinMap
K
MK
,
FinMap
A
MA
,
FinSet
K
SK
,
!
LeibnizEquiv
SK
}
.
Local
Notation
map_preimage
:=
(
map_preimage
(
K
:=
K
)
(
A
:=
A
)
(
MKA
:=
MK
A
)
(
MASK
:=
MA
SK
)
(
SK
:=
SK
))
.
Implicit
Types
m
:
MK
A
.
Lemma
map_preimage_empty
:
map_preimage
∅
=
∅.
Proof
.
apply
map_fold_empty
.
Qed
.
Lemma
map_preimage_insert
m
i
x
:
m
!!
i
=
None
→
map_preimage
(
<
[
i
:=
x
]
>
m
)
=
partial_alter
(
λ
mX
,
Some
({[
i
]}
∪
default
∅
mX
))
x
(
map_preimage
m
)
.
Proof
.
intros
Hi
.
refine
(
map_fold_insert_L
_
_
i
x
m
_
Hi
)
.
intros
j1
j2
x1
x2
m'
?
_
_
.
destruct
(
decide
(
x1
=
x2
))
as
[
->
|?]
.
-
rewrite
<-!
partial_alter_compose
.
apply
partial_alter_ext
;
intros
?
_;
f_equal
/=.
set_solver
.
-
by
apply
partial_alter_commute
.
Qed
.
(** The [preimage] function never returns an empty set (we represent that case
via [None]). *)
Lemma
lookup_preimage_Some_non_empty
m
x
:
map_preimage
m
!!
x
≠
Some
∅.
Proof
.
induction
m
as
[|
i
x'
m
?
IH
]
using
map_ind
.
{
by
rewrite
map_preimage_empty
,
lookup_empty
.
}
rewrite
map_preimage_insert
by
done
.
destruct
(
decide
(
x
=
x'
))
as
[
->
|]
.
-
rewrite
lookup_partial_alter
.
intros
[
=
]
.
set_solver
.
-
rewrite
lookup_partial_alter_ne
by
done
.
set_solver
.
Qed
.
Lemma
lookup_preimage_None_1
m
x
i
:
map_preimage
m
!!
x
=
None
→
m
!!
i
≠
Some
x
.
Proof
.
induction
m
as
[|
i'
x'
m
?
IH
]
using
map_ind
;
[
by
rewrite
lookup_empty
|]
.
rewrite
map_preimage_insert
by
done
.
destruct
(
decide
(
x
=
x'
))
as
[
->
|]
.
-
by
rewrite
lookup_partial_alter
.
-
rewrite
lookup_partial_alter_ne
,
lookup_insert_Some
by
done
.
naive_solver
.
Qed
.
Lemma
lookup_preimage_Some_1
m
X
x
i
:
map_preimage
m
!!
x
=
Some
X
→
i
∈
X
↔
m
!!
i
=
Some
x
.
Proof
.
revert
X
.
induction
m
as
[|
i'
x'
m
?
IH
]
using
map_ind
;
intros
X
.
{
by
rewrite
map_preimage_empty
,
lookup_empty
.
}
rewrite
map_preimage_insert
by
done
.
destruct
(
decide
(
x
=
x'
))
as
[
->
|]
.
-
rewrite
lookup_partial_alter
.
intros
[
=
<-
]
.
rewrite
elem_of_union
,
elem_of_singleton
,
lookup_insert_Some
.
destruct
(
map_preimage
m
!!
x'
)
as
[
X'
|]
eqn
:
Hx'
;
simpl
.
+
rewrite
IH
by
done
.
naive_solver
.
+
apply
(
lookup_preimage_None_1
_
_
i
)
in
Hx'
.
set_solver
.
-
rewrite
lookup_partial_alter_ne
,
lookup_insert_Some
by
done
.
naive_solver
.
Qed
.
Lemma
lookup_preimage_None
m
x
:
map_preimage
m
!!
x
=
None
↔
∀
i
,
m
!!
i
≠
Some
x
.
Proof
.
split
;
[
by
eauto
using
lookup_preimage_None_1
|]
.
intros
Hm
.
apply
eq_None_not_Some
;
intros
[
X
?]
.
destruct
(
set_choose_L
X
)
as
[
i
?]
.
{
intros
->
.
by
eapply
lookup_preimage_Some_non_empty
.
}
by
eapply
(
Hm
i
),
lookup_preimage_Some_1
.
Qed
.
Lemma
lookup_preimage_Some
m
x
X
:
map_preimage
m
!!
x
=
Some
X
↔
X
≠
∅
∧
∀
i
,
i
∈
X
↔
m
!!
i
=
Some
x
.
Proof
.
split
.
-
intros
HxX
.
split
;
[
intros
->
;
by
eapply
lookup_preimage_Some_non_empty
|]
.
intros
j
.
by
apply
lookup_preimage_Some_1
.
-
intros
[
HXne
HX
]
.
destruct
(
map_preimage
m
!!
x
)
as
[
X'
|]
eqn
:
HX'
.
+
f_equal
;
apply
set_eq
;
intros
i
.
rewrite
HX
.
by
apply
lookup_preimage_Some_1
.
+
apply
set_choose_L
in
HXne
as
[
j
?]
.
apply
(
lookup_preimage_None_1
_
_
j
)
in
HX'
.
naive_solver
.
Qed
.
Lemma
lookup_total_preimage
m
x
i
:
i
∈
map_preimage
m
!!!
x
↔
m
!!
i
=
Some
x
.
Proof
.
rewrite
lookup_total_alt
.
destruct
(
map_preimage
m
!!
x
)
as
[
X
|]
eqn
:
HX
.
-
by
apply
lookup_preimage_Some
.
-
rewrite
lookup_preimage_None
in
HX
.
set_solver
.
Qed
.
End
preimage
.
(** * Tactics *)
(** The tactic [decompose_map_disjoint] simplifies occurrences of [disjoint]
in the hypotheses that involve the empty map [∅], the union [(∪)] or insert
Loading