-
Robbert Krebbers authoredRobbert Krebbers authored
In this changelog, we document "large-ish" changes to Iris that affect even the way the logic is used on paper. We also document changes in the Coq development; every API-breaking change should be listed, but not every new lemma.
Iris master
With this release, we dropped support for Coq 8.9.
Changes in algebra
:
- Rename
agree_op_inv'
toto_agree_op_inv
,agree_op_invL'
toto_agree_op_inv_L
, and addto_agree_op_invN
. - Rename
auth_auth_frac_op_invL
toauth_auth_frac_op_inv_L
,excl_auth_agreeL
toexcl_auth_agree_L
,frac_auth_agreeL
tofrac_auth_agree_L
, andufrac_auth_agreeL
toufrac_auth_agree_L
. - Add constructions to define a camera through restriction of the validity predicate
(
iso_cmra_mixin_restrict
) and through an isomorphism (iso_cmra_mixin
). - Add a
frac_agree
library which encapsulatesfrac * agree A
for some OFEA
, and provides some useful lemmas. - Fix direction of
auth_auth_validN
to make it consistent with similar lemmas, e.g.,auth_auth_valid
. The direction is now✓{n} (● a) ↔ ✓{n} a
. - Rename
auth_both_valid
toauth_both_valid_discrete
andauth_both_frac_valid
toauth_both_frac_valid_discrete
. The old name is used for new, stronger lemmas that do not assume discreteness. - Add the view camera
view
, which generalizes the authoritative cameraauth
by being parameterized by a relation that relates the authoritative element with the fragments. - Redefine the authoritative camera in terms of the view camera. As part of this
change, we have removed lemmas that leaked implementation details. Hence, the
only way to construct elements of
auth
is via the elements●{q} a
and◯ b
. The constructorAuth
, and the projectionsauth_auth_proj
andauth_frag_proj
no longer exist. Lemmas that referred to these constructors have been removed, in particular:auth_equivI
,auth_validI
,auth_included
,auth_valid_discrete
, andauth_both_op
. For validity, useauth_auth_valid*
,auth_frag_valid*
, orauth_both_valid*
instead. - Rename
auth_update_core_id
intoauth_update_frac_alloc
. - Add the camera of discardable fractions
dfrac
. This is a generalization of the normal fractional camera. Seetheories/algebra/dfrac.v
for further information. - Rename
cmra_monotone_valid
intocmra_morphism_valid
(this rename was forgotten in !56). - Add
gmap_view
, a camera providing a "view of agmap
". The authoritative element is anygmap
; the fragment provides fractional ownership of a single key, including support for persistent read-only ownership throughdfrac
. Seetheories/algebra/lib/gmap_view.v
for further information. NOTE: The API surface forgmap_view
is experimental and subject to change. - Move the
*_validI
and*_equivI
lemmas to a new module,base_logic.algebra
. That module is exported bybase_logic.base_logic
so it should usually be available everywhere without further changes. - The authoritative fragment
✓ (◯ b : auth A)
is no longer definitionally equal to✓ b
. - Add
mnat_auth
, a wrapper forauth max_nat
. The result is an authoritativenat
where a fragment is a lower bound whose ownership is persistent.
Changes in proofmode
:
- The proofmode now preserves user-supplied names for existentials when using
iDestruct ... as (?) "..."
. This is backwards-incompatible if you were relying on the previous automatic names (which were always "H", possibly freshened). It also requires some changes if you were implementingIntoExist
yourself, since the typeclass now forwards names. If your instance transforms oneIntoExist
into another, you can generally just forward the name from the premise. - The proofmode also preserves user-supplied names in
iIntros
, for example withiIntros (?)
andiIntros "%"
, as described for destructing existentials above. As part of this change, it now uses a base name ofH
for pure facts rather than the previous default ofa
. This also requires some changes if you were implementingFromForall
, in order to forward names. - Make
iFrame
"less" smart w.r.t. clean up of modalities. It now consistently removes the modalities<affine>
,<absorbing>
,<persistent>
and□
only if the result after framing isTrue
oremp
. In particular, it no longer removes<affine>
if the result after framing is affine, and it no longer removes□
if the result after framing is intuitionistic. - Allow framing below an
<affine>
modality if the hypothesis that is framed is affine. (Previously, framing below<affine>
was only possible if the hypothesis that is framed resides in the intuitionistic context.) - Remove the laws
pure_forall_2 : (∀ a, ⌜ φ a ⌝) ⊢ ⌜ ∀ a, φ a ⌝
from the BI interface and factor it into a type classBiPureForall
. - Add notation
¬ P
forP → False
tobi_scope
.
Changes in the logic (base_logic
, bi
):
- Add a
ghost_var
library that provides (fractional) ownership of a ghost variable of arbitraryType
. - Change type of some ghost state lemmas (mostly about allocation) to use
∗
instead of∧
(consistent with our usual style). This affects the following lemmas:own_alloc_strong_dep
,own_alloc_cofinite_dep
,own_alloc_strong
,own_alloc_cofinite
,own_updateP
,saved_anything_alloc_strong
,saved_anything_alloc_cofinite
,saved_prop_alloc_strong
,saved_prop_alloc_cofinite
,saved_pred_alloc_strong
,saved_pred_alloc_cofinite
,auth_alloc_strong
,auth_alloc_cofinite
,auth_alloc
. - Change
uPred_mono
to only require inclusion at the smaller step-index. - Put
iProp
/iPreProp
-isomorphism into theown
construction. This affects clients that define higher-order ghost state constructions. Concretely, when defining aninG
, the functor no longer needs to be applied toiPreProp
, but should be applied toiProp
. This avoids clients from having to push through theiProp
/iPreProp
-isomorphism themselves, which is now handled once and for all by theown
construction. - Rename
gen_heap_ctx
togen_heap_interp
, since it is meant to be used in the state interpretation of WP and since_ctx
is elsewhere used as a suffix indicating "this is a persistent assumption that clients should always have in their context". Likewise, renameproph_map_ctx
toproph_map_interp
. - Move
uPred.prod_validI
,uPred.option_validI
, anduPred.discrete_fun_validI
to the newbase_logic.algebra
module. That module is exported bybase_logic.base_logic
so these names are now usually available everywhere, and no longer inside theuPred
module. - Add an
mnat
library on top ofmnat_auth
that supports ghost state which is an authoritative, monotonically-increasingnat
with a proposition giving a persistent lower bound. Seebase_logic.lib.mnat
for further details. - Add big op lemmas
big_op{L,L2,M,M2,S}_intuitionistically_forall
andbig_sepL2_forall
,big_sepMS_forall
,big_sepMS_impl
, andbig_sepMS_dup
.
Changes in program_logic
:
-
wp_strong_adequacy
now applies to an initial state with multiple threads instead of only a single thread. The derived adequacy lemmas are unchanged.
The following sed
script helps adjust your code to the renaming (on macOS,
replace sed
by gsed
, installed via e.g. brew install gnu-sed
).
Note that the script is not idempotent, do not run it twice.
sed -i -E -f- $(find theories -name "*.v") <<EOF
# agree and L suffix renames
s/\bagree_op_inv'/to_agree_op_inv/g
s/\bagree_op_invL'/to_agree_op_inv_L/g
s/\bauth_auth_frac_op_invL\b/auth_auth_frac_op_inv_L/g
s/\b(excl|frac|ufrac)_auth_agreeL/\1_auth_agree_L/g
# auth_both_valid
s/\bauth_both_valid\b/auth_both_valid_discrete/g
s/\bauth_both_frac_valid\b/auth_both_frac_valid_discrete/g
# gen_heap_ctx and proph_map_ctx
s/\bgen_heap_ctx\b/gen_heap_interp/g
s/\bproph_map_ctx\b/proph_map_interp/g
EOF
Iris 3.3.0 (released 2020-07-15)
This release does not have any outstanding highlights, but contains a large number of improvements all over the board. For instance:
-
heap_lang
now supports deallocation as well as better reasoning about "invariant locations" (locations that perpetually satisfy some Coq-level invariant). - Invariants (
inv N P
) are more flexible, now also supporting splitting and merging of invariants with respect to separating conjunction. - Performance of the proofmode for BIs constructed on top of other BIs (e.g.,
monPred
) was greatly improved, leading to up to 70% speedup in individual files. As part of this refactoring, the proofmode can now also be instantiated with entirely "logical" notion of BIs that do not have a (non-trivial) metric structure, and still support reasoning about ▷. - The proof mode now provides experimental support for naming pure facts in intro patterns. See iris/string-ident for details.
- Iris now provides official ASCII notation. We still recommend using the Unicode notation for better consistency and interoperability with other Iris libraries, but provide ASCII notation for when Unicode is not an option.
- We removed several coercions, fixing "ambiguous coercion path" warnings and solving some readability issues.
- Coq 8.10, 8.11, and 8.12 are newly supported by this release, and Coq 8.7 and 8.8 are no longer supported.
Further details are given in the changelog below. We always first list the potentially breaking changes, then (some of) the additions.
This release of Iris received contributions by Abel Nieto, Amin Timany, Dan Frumin, Derek Dreyer, Dmitry Khalanskiy, Gregory Malecha, Jacques-Henri Jourdan, Jonas Kastberg, Jules Jacobs, Matthieu Sozeau, Maxime Dénès, Michael Sammler, Paolo G. Giarrusso, Ralf Jung, Robbert Krebbers, Simon Friis Vindum, Simon Spies, and Tej Chajed. Thanks a lot to everyone involved!
Changes in heap_lang
:
-
Remove global
Open Scope Z_scope
fromheap_lang.lang
, and leave it up to reverse dependencies if they want toOpen Scope Z_scope
or not. -
Fix all binary operators performing pointer arithmetic (instead of just the dedicated
OffsetOp
operator doing that). -
Rename
heap_lang.lifting
toheap_lang.primitive_laws
. There now also existsheap_lang.derived_laws
. -
Make lemma names for
fill
more consistent- Use the
_inv
suffix for the the backwards directions:reducible_fill
→reducible_fill_inv
,reducible_no_obs_fill
→reducible_no_obs_fill_inv
,not_stuck_fill
→not_stuck_fill_inv
. - Use the non-
_inv
names (that freed up) for the forwards directions:reducible_fill
,reducible_no_obs_fill
,irreducible_fill_inv
.
- Use the
-
Remove namespace
N
fromis_lock
. -
Add support for deallocation of locations via the
Free
operation. -
Add a fraction to the heap_lang
array
assertion. -
Add
lib.array
module for deallocating, copying and cloning arrays. -
Add TWP (total weakest-pre) lemmas for arrays.
-
Add a library for "invariant locations": heap locations that will not be deallocated (i.e., they are GC-managed) and satisfy some pure, Coq-level invariant. See
iris.base_logic.lib.gen_inv_heap
for details. -
Add the ghost state for "invariant locations" to
heapG
. This affects the statement ofheap_adequacy
, which is now responsible for initializing the "invariant locations" invariant. -
Add lemma
mapsto_mapsto_ne : ¬ ✓(q1 + q2)%Qp → l1 ↦{q1} v1 -∗ l2 ↦{q2} v2 -∗ ⌜l1 ≠ l2⌝
. -
Add lemma
is_lock_iff
and show thatis_lock
is contractive.