Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • iris/iris
  • jeehoon.kang/iris-coq
  • amintimany/iris-coq
  • dfrumin/iris-coq
  • Villetaneuse/iris
  • gares/iris
  • shiatsumat/iris
  • Blaisorblade/iris
  • jihgfee/iris-coq
  • mrhaandi/iris
  • tlsomers/iris
  • Quarkbeast/iris-coq
  • janno/iris
  • amaurremi/iris-coq
  • proux/iris
  • tchajed/iris
  • herbelin/iris-coq
  • msammler/iris-coq
  • maximedenes/iris-coq
  • bpeters/iris
  • haidang/iris
  • lepigre/iris
  • lczch/iris
  • simonspies/iris
  • gpirlea/iris
  • dkhalanskiyjb/iris
  • gmalecha/iris
  • germanD/iris
  • aa755/iris
  • jules/iris
  • abeln/iris
  • simonfv/iris
  • atrieu/iris
  • arthuraa/iris
  • simonh/iris
  • jung/iris
  • mattam82/iris
  • Armael/iris
  • adamAndMath/iris
  • gmevel/iris
  • snyke7/iris
  • johannes/iris
  • NiklasM/iris
  • simonspies/iris-parametric-index
  • svancollem/iris
  • proux1/iris
  • wmansky/iris
  • LukeXuan/iris
  • ivanbakel/iris
  • SkySkimmer/iris
  • tjhance/iris
  • yiyunliu/iris
  • Lee-Janggun/iris
  • thomas-lamiaux/iris
  • dongjae/iris
  • dnezam/iris
  • Tragicus/iris
  • clef-men/iris
  • ffengyu/iris
59 results
Show changes
Commits on Source (1970)
*.v gitlab-language=coq *.v gitlab-language=coq
# Convert to native line endings on checkout.
*.ref text
# Shell scripts need Linux line endings.
*.sh eol=lf
...@@ -22,3 +22,6 @@ Makefile.coq.conf ...@@ -22,3 +22,6 @@ Makefile.coq.conf
.Makefile.coq.d .Makefile.coq.d
Makefile.package.* Makefile.package.*
.Makefile.package.* .Makefile.package.*
_opam
_build
*.install
...@@ -5,9 +5,29 @@ stages: ...@@ -5,9 +5,29 @@ stages:
variables: variables:
CPU_CORES: "10" CPU_CORES: "10"
OCAML: "ocaml-variants.4.14.0+options ocaml-option-flambda"
# Avoid needlessly increasing our TCB with native_compute
COQEXTRAFLAGS: "-native-compiler no"
.only_branches: &only_branches
only:
- /^master/@iris/iris
- /^ci/@iris/iris
.only_mr: &only_mr
only:
- merge_requests
.branches_and_mr: &branches_and_mr
only:
- /^master/@iris/iris
- /^ci/@iris/iris
- merge_requests
.template: &template .template: &template
<<: *only_branches
stage: build stage: build
interruptible: true
tags: tags:
- fp - fp
script: script:
...@@ -17,9 +37,6 @@ variables: ...@@ -17,9 +37,6 @@ variables:
key: "$CI_JOB_NAME" key: "$CI_JOB_NAME"
paths: paths:
- _opam/ - _opam/
only:
- /^master/@iris/iris
- /^ci/@iris/iris
except: except:
- triggers - triggers
- schedules - schedules
...@@ -27,49 +44,49 @@ variables: ...@@ -27,49 +44,49 @@ variables:
## Build jobs ## Build jobs
build-coq.dev: # The newest version runs with timing.
<<: *template build-coq.8.20.1:
variables:
OPAM_PINS: "coq version dev"
build-coq.8.13.dev:
<<: *template <<: *template
variables: variables:
OPAM_PINS: "coq version 8.13.dev" OPAM_PINS: "coq version 8.20.1"
build-coq.8.12.1:
<<: *template
variables:
OPAM_PINS: "coq version 8.12.1"
DENY_WARNINGS: "1" DENY_WARNINGS: "1"
MANGLE_NAMES: "1"
OPAM_PKG: "1" OPAM_PKG: "1"
DOC_DIR: "coqdoc@center.mpi-sws.org:iris" DOC_DIR: "coqdoc@center.mpi-sws.org:iris"
DOC_OPTS: "--external https://plv.mpi-sws.org/coqdoc/stdpp/ stdpp" DOC_OPTS: "--external https://plv.mpi-sws.org/coqdoc/stdpp/ stdpp"
tags: tags:
- fp-timing - fp-timing
interruptible: false
build-coq.8.11.2: # The newest version also runs in MRs, without timing.
build-coq.8.20.1-mr:
<<: *template <<: *template
<<: *only_mr
variables: variables:
OPAM_PINS: "coq version 8.11.2" OPAM_PINS: "coq version 8.20.1"
DENY_WARNINGS: "1"
MANGLE_NAMES: "1"
# Nightly job with a known-to-work Coq version # Also ensure Dune works.
# (so failures must be caused by std++) build-coq.8.20.1-dune:
build-stdpp.dev-coq.8.12.1:
<<: *template <<: *template
<<: *branches_and_mr
variables: variables:
OPAM_PINS: "coq version 8.12.1 coq-stdpp.dev git git+https://gitlab.mpi-sws.org/iris/stdpp.git#$STDPP_REV" OPAM_PINS: "coq version 8.20.1 dune version 3.15.2"
except: MAKE_TARGET: "dune"
only:
- triggers # The oldest version runs in MRs, without name mangling.
- schedules build-coq.8.19.2:
- api <<: *template
<<: *branches_and_mr
variables:
OPAM_PINS: "coq version 8.19.2"
# Nightly job with latest Coq beta branch trigger-stdpp.dev:
build-stdpp.dev-coq.8.13.dev:
<<: *template <<: *template
variables: variables:
OPAM_PINS: "coq version 8.13.dev coq-stdpp.dev git git+https://gitlab.mpi-sws.org/iris/stdpp.git#$STDPP_REV" STDPP_REPO: "iris/stdpp"
OPAM_PINS: "coq version $NIGHTLY_COQ git+https://gitlab.mpi-sws.org/$STDPP_REPO#$STDPP_REV"
CI_COQCHK: "1" CI_COQCHK: "1"
except: except:
only: only:
......
[submodule "ci"]
path = ci
url = https://gitlab.mpi-sws.org/FP/iris-ci.git
...@@ -5,32 +5,1145 @@ lemma. ...@@ -5,32 +5,1145 @@ lemma.
## Iris master ## Iris master
With this release, we dropped support for Coq 8.9 and Coq 8.10. **Changes in `algebra`:**
* Add lemma `ufrac_auth_update_surplus_cancel`.
* Rename `CsumBot`, `GSetBot`, `CoPsetBot` and `ExclBot` to `*Invalid`.
* Add `agree_includedN`, `excl_included` and `excl_includedN`.
**Changes in `base_logic`:**
* Add lemmas `own_forall` and `own_and` to reason about universal quantification
(`∀ .. own`) and conjunctions (`own .. ∧ own ..`) of ghost ownership. (by
Travis Hance)
+ These rules are derived from the new primitive rule `ownM_forall` (which is
proved in the `uPred` model).
+ Various corollaries for total cmras (which include `ucmra`s) are provided.
* Add lemma `Some_included_totalI`.
* Simplify lemma `excl_includedI` to use `=` instead of `match`.
**Changes in `bi`:**
* Merge the two `BiFUpdPlainly` laws `fupd_plainly_mask_empty` and
`fupd_plainly_keep_l` into a single law, by generalizing `fupd_plainly_keep_l`
so that it subsumes both of them.
* Change `WP` notation to allow type annotations and (exhaustive) patterns for
the return value binder.
* Rename `bi.lib.fixpoint` module to `bi.lib.fixpoint_mono`.
* Add `bi.lib.fixpoint_banach` module with lemmas for proving that a `fixpoint`
(of a contractive function) is persistent/affine/etc. (with help from William
Mansky)
* Remove the `bool`-valued `stuckness_leb`; use `stuckness_le` (in `Prop`)
instead.
**Changes in `proofmode`:**
* Generalize `AsEmpValid` to allow specifying which directions of the bi-implication
hold. This allows embedded logics to enable support for `iPoseProof` and `iStartProof`
independently. (by Michael Sammler)
**Changes in `heap_lang`:**
* Add `Inhabited lock_name` to `lock` class. (by Daniel Nezamabadi)
**Infrastructure:**
* Use `gmake` (GNU Make) instead of `make` on BSD systems. (by Yiyun Liu)
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
# "*Bot* RA element rename
s/\b(Csum|GSet|CoPset|Excl)Bot(\b|_)/\\1Invalid\\2/g
# bi.lib.fixpoint rename: adjust imports
s/(From iris.* Require .*|Require iris.*)\bfixpoint\b/\\1fixpoint_mono/g
EOF
```
## Iris 4.3.0 (2024-10-30)
This Iris release mostly features quality-of-life improvements, such as
improvements to `iInduction`, a new `iUnfold` tactic, and improved errors
in `iInv`. Furthermore, like std++, Iris can now be built with dune.
Iris 4.3.0 supports Coq 8.19 and 8.20. Coq 8.18 is no longer supported.
This release was managed by Jesper Bengtson, Ralf Jung and Robbert Krebbers,
with contributions from Benjamin Peters, Isaac van Bakel, Jan-Oliver Kaiser,
Janggun Lee, Michael Sammler, Ralf Jung, Robbert Krebbers, Rodolphe Lepigre
Sanjit Bhat, Tej Chajed, William Mansky, and Yusuke Matsushita.
Thanks a lot to everyone involved!
**Changes in `algebra`:**
* Add lemmas `big_opS_gset_to_gmap` and `big_opS_gset_to_gmap_L`, which rewrite
between `gset_to_gmap` and big set ops of singleton maps. (by Isaac van
Bakel)
* Add lemmas `discrete_fun_update` and `discrete_fun_updateP`, which updates an
abitrary `discrete_fun` to another. For `discrete_fun_updateP`, this requires
the domain to be finite, similar to `discrete_fun_included_spec`. (by Janggun Lee)
* Add lemmas `discrete_fun_singleton_valid` and `discrete_fun_singleton_unit`, which simplify
cmra validity and unit used with `discrete_fun_singleton`. (by Janggun Lee)
* Add `Inhabited` instance for the solution of the COFE solver.
**Changes in `bi`:**
* Add instances for `match _ with _ end` (and thus `if _ then _ else` and
`'(_, _)` pair destructuring) for `Persistent`, `Affine`, `Absorbing`,
`Timeless`, and `Plain`. (by Sanjit Bhat)
**Changes in `proofmode`:**
* Remove the `*` specialization pattern. This pattern has been deprecated and a
no-op since 2017. See https://gitlab.mpi-sws.org/iris/iris/-/merge_requests/41.
* Improve the error message of `iInv` in case the goal does not support
invariant opening.
* Change `iInduction` to always generate a magic wand instead of sometimes
generating an implication for reverted hypotheses.
* Add `iUnfold` tactic.
* Improve ability to name induction hypotheses (IHs) in `iInduction`: when
performing `iInduction x as cpat` the names of the IHs in the Coq introduction
pattern `cpat` are used to name the IHs in the proof mode context. For
example, `iInduction n as [|n IH]` and `iInduction t as [|l IHl r IHr]`.
**Changes in `base_logic`:**
* Add lemma `na_own_empty` and persistence instance for `na_own p ∅` for
non-atomic invariant tokens. (by Benjamin Peters)
* Add instances `big_sepL_flip_mono'`, `big_sepM_flip_mono'`, etc., which are
wrappers of instances `big_sep*_mono'` for `flip (⊢)` instead of `(⊢)`. (by
Yusuke Matsushita)
**Changes in `program_logic`:**
* Add missing proofmode instances for error reporting and opening invariants
around total weakest preconditions. (by Janggun Lee)
**Changes in `heap_lang`:**
* Make `wp_cmpxchg_fail` work when the points-to is in the persistent context.
* Seal definition of `pointsto`, add copies of all relevant lemmas.
**Infrastructure:**
* Add support for compiling the packages with dune. (by Rodolphe Lepigre)
## Iris 4.2.0 (2024-04-12)
The highlights of this release are:
* We have new laws to "undiscard" discarded fractions, allowing one to update
from `DfracDiscarded` to `DfracOwn(q)` for some fresh `q`. This gives rise to
new laws for all constructions that use `dfrac`, such as
`ghost_map_elem_unpersist : ∀ k γ v, k ↪[γ]□ v ==∗ ∃ q, k ↪[γ]{#q} v`.
* The `gmap_view K V` camera now supports value types `V` that are arbitrary
cameras, and lifts their composition to the whole map. The previous `gmap_view`
type can be recovered as `gmap_view K (agree V)`.
* The `iFrame` tactic has become stronger for goals that contain existential
quantifiers: `iFrame` will now attempt to instantiate these. For example,
framing `P x` in goal `Q ∗ ∃ y, P y ∗ R` will now succeed with remaining
goal `Q ∗ R`.
Iris 4.2 supports Coq 8.18 and 8.19.
Coq 8.16 and 8.17 are no longer supported.
This release was managed by Ralf Jung and Robbert Krebbers, with contributions
from Ike Mulder, Jan-Oliver Kaiser, Johannes Hostert, Pierre Roux, Thomas
Somers, and Yixuan Chen. Thanks a lot to everyone involved!
**Changes in `algebra`:**
* Rename `discrete` to `discrete_0`, to make room for a new lemma `discrete`
that works for all `n` : `x ≡{n}≡ y → x ≡ y`.
* Enable `f_equiv` and `solve_proper` to exploit the fact that `≡{n}≡` is a
subrelation of `≡` and `=`.
* Rename `iso_cmra_mixin_restrict` to `iso_cmra_mixin_restrict_validity`, and
simplify its statement and that of `iso_cmra_mixin` by removing the `g_equiv`
assumption that follows from the other assumptions.
* Add `inj_cmra_mixin_restrict_validity` as a more general version of
`iso_cmra_mixin_restrict_validity`.
* Change statement of `Z_local_update` to be more intuitive. It now says
`x - y = x' - y' → (x,y) ~l~> (x',y')`, i.e., the difference between the
authoritative element and the fragment must stay the same.
* Rename `cmra_discrete_update``cmra_discrete_total_update` and
`cmra_discrete_updateP``cmra_discrete_total_updateP`. Repurpose original
names for lemmas that only require `CmraDiscrete`, not `CmraTotal`.
* Add a law for undiscarding discarded fractions, allowing one to update from
`DfracDiscarded` to `DfracOwn(q)` for some fresh `q`. This formalizes the
intuition that a discarded fraction is merely an "existentially quantified
fraction." (by Johannes Hostert)
* Add laws for un-persisting resources with a discardable fractional part,
based on the undiscarding law for discardable fractions. For example,
`gmap_view_frag k DfracDiscarded v ~~>: λ a, ∃ q, a = gmap_view_frag k (DfracOwn q) v`
will allow recovering a fractional points-to from a discarded one. (by Johannes
Hostert)
* Generalize `gmap_viewUR K A` from `A : ofe` to `A : cmra`. Previously, the
"agreement" camera was part of the definition, now the user can pick an
arbitrary camera. All lemmas that exposed agreement properties have
been generalized to expose general camera validity/composition.
For porting:
+ Replace `gmap_viewR K V` by `gmap_viewR K (agreeR V)`.
+ Definitions and proofs on top of this will need to be manually adjusted.
+ Replace `gmap_view_update` by `gmap_view_replace`.
+ Proofs using `gmap_view_both_dfrac_valid_L` should instead use
`gmap_view_both_dfrac_valid_discrete_total` followed by `to_agree_included_L`.
**Changes in `proofmode`:**
* The `iFrame` tactic has become slightly weaker for goals that contain both
evars and either `∨` or `∧`. This prevents an exponential slowdown of
`iFrame` on some goals. This change should be backwards compatible for almost
all proofs. If you define or use custom `Frame` instances, note that the
`MaybeFrame` class has become notation for `TCNoBackTrack (MaybeFrame' ...)`,
which means the proofs of your instances might need a slight refactoring.
* Adjust the `iFrame` proof search to use `QuickAffine` and `QuickAbsorbing`
instead of `Affine` and `Absorbing`. This fixes some performance issues with
large terms in non-affine logics, at the expense of a slight reduction in what
`iFrame` can do in these logics.
* The `iFrame` tactic has become stronger for goals that contain existential
quantifiers: `iFrame` will now attempt to instantiate these. For example,
framing `P x` in goal `Q ∗ ∃ y, P y ∗ R` will now succeed with remaining
goal `Q ∗ R`. `iFrame` still behaves the same when no instantiation can be
found: framing `R` in goal `Q ∗ ∃ y, P y ∗ R` still gives `Q ∗ ∃ y, P y`.
This should simplify and potentially even speed up some proofs (MR: iris/iris!1017).
Porting to this change will require manually fixing broken proofs: `iFrame`
may now make more progress than your proof script expects. Proofs that look
like `iFrame. iExists _. iFrame.` may need to be replaced with just `iFrame.`
In some cases, you may need to be explicit in what hypotheses to `iFrame`,
to prevent wrong instantiation of existential quantifiers.
To temporarily fix broken proofs, you can restore `iFrame`'s old behavior with:
```
Local Instance frame_exist_instantiate_disabled :
FrameInstantiateExistDisabled := {}.
```
`iFrame` will not instantiate existential quantifiers below connectives such as
`-∗`, `∀`, `→` and `WP`, since this is more frequently unsafe (MR: iris/iris!1035).
If you have custom recursive `Frame` instances for which you want to disable
instantiating existential quantifiers, you need to replace the `Frame ...` premise
of your instance with `(FrameInstantiateExistDisabled → Frame ...)`.
* `iFrame` no longer loops on `[∗mset ] x ∈ X, ..` when `X` is an existential variable
(MR: iris/iris!1039). (by Jan-Oliver Kaiser for BedRock Systems)
**Changes in `base_logic`:**
* Rename `mapsto` to `pointsto` to align with standard separation logic
terminology.
* Add laws for un-persisting assertions with a discardable fractional permission,
for example `l ↦□ v ==∗ ∃ q, l ↦{#q} v`, using the new laws from `algebra`
(see above). These laws allow one to update a persistent (discarded) assertion,
like a points-to, back into a fractionally owned one, where the fraction is
existentially quantified. They are useful when e.g. constructing invariants
that allow exchanging fractional assertions. See !960 for more details. (by
Johannes Hostert)
* Add `token` library, providing a simple ghost token as a logic-level wrapper
over the RA `excl unit`.
* Add lemma `lc_fupd_add_laterN`. (by Thomas Somers)
**Changes in `program_logic`:**
* Rename `head_step` to `base_step` to avoid potential confusion with the
standard term "head reduction", and also rename all associated definitions and
lemmas. In particular: `head_stuck``base_stuck`, `head_reducible`
`base_reducible`, `head_irreducible``base_irreducible`, `head_redex`
`base_redex`, `head_atomc``base_atomic`. The sed script will rename all
definitions and lemmas that come with Iris, but if you had additional
definitions or lemmas with `head` in their name, you will have to rename them
by hand if you want to remain consistent.
**Changes in `heap_lang`:**
* Replace `wp_lb_init` with a more general `steps_lb_0` lemma for creating a
`steps_lb` without depending on WP. (by Thomas Somers)
* Add generic lemma `twp_wp_step_lc` to derive WP with later credits from TWP.
* Add Texan triples with later credits for stateful operations: `wp_alloc_lc`,
`wp_alloc_lc`, `wp_free_lc`, `wp_load_lc`, `wp_store_lc`, `wp_xchg_lc`,
`wp_cmpxchg_fail_lc`, `wp_cmpxchg_suc_lc`, and `wp_faa_lc`.
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
# discrete camera updates
s/\bcmra_discrete_update\b/cmra_discrete_total_update/g
s/\bcmra_discrete_updateP\b/cmra_discrete_total_updateP/g
# maps-to → points-to
s/(\b|_)mapsto(\b|_)/\1pointsto\2/g
# Head reduction
s/(\b|_)head_(step|stuck|ctx|prim_|(ir)?reducible)/\1\base_\2/g
EOF
```
## Iris 4.1.0 (2023-10-11)
This Iris release mostly features quality-of-life improvements, such as smarter
handling of `->`/`<-` patterns by `iDestruct`, support for an arbitrary number of
Coq intro patterns in the Iris proofmode tactics (`iIntros`, `iDestruct`, etc.),
and support for immediately introducing the postcondition of a WP specification
via `wp_apply lemma as "Hpost"`.
The biggest changes and new features are:
* Logically atomic triples now support private (non-atomic) postconditions, and
the notation was changed to not clash with Autosubst any more. Existing users
of logically atomic specifications have to update their notation, see the full
CHANGELOG for more details.
* The meaning of `P -∗ Q` as a Coq proposition has changed from `P ⊢ Q` to
`⊢ P -∗ Q`. If you are only using the Iris proofmode, this will not make a
difference, but when writing proof scripts or tactics that `rewrite` or
`apply` Iris lemmas, the exact position of the `⊢ P -∗ Q` matters and this
will now always be visible in lemma statements.
* `iCombine` is starting to gain support for a `gives` clause, which yields
persistent facts gained from combining the resources. So far, this remains
mostly experimental. We support `↦` and the connectives of ghost theories in
`base_logic/lib`, but support for `own` and custom cameras is minimal and will
be improved in future releases.
* Some initial refactoring prepares Iris for eventually supporting transfinite step-indexing.
* New resources algebras have been added: `Z`, `max_Z`, `mono_Z`, and `mra` (the
monotone resource algebra of https://iris-project.org/pdfs/2021-CPP-monotone-final.pdf)
Iris 4.1 supports Coq 8.16-8.18. Coq 8.13-8.15 are no longer supported.
This release was managed by Ralf Jung, Robbert Krebbers, and Johannes Hostert,
with contributions from Amin Timany, Arthur Azevedo de Amorim, Armaël Guéneau,
Benjamin Peters, Dan Frumin, Dorian Lesbre, Ike Mulder, Isaac van Bakel, Jaemin
Choi, Janine Lohse, Jan-Oliver Kaiser, Jonas Kastberg Hinrichsen, Lennard Gäher,
Mathias Adam Møller, Michael Sammler, Paolo Giarrusso, Pierre Roux, Rodolphe
Lepigre, Simcha van Collem, Simon Friis Vindum, Simon Spies, Tej Chajed, Yixuan
Chen, and Yusuke Matsushita. Thanks a lot to everyone involved!
**Changes in `prelude`:**
* Re-export `stdpp.options` from `iris.prelude.options`. This enables 'light'
name mangling, which prefixes auto-generated names with `__`. This only
affects developments that explicitly opt-in to following the Iris
configuration by importing `iris.prelude.options`.
**Changes in `algebra`:**
* Add (basic) support for `gset` and `gset_disj` cameras to `set_solver`.
* Rename `sig_{equiv,dist}_alt` into `sig_{equiv,dist}_def` and state these
lemmas using `=` instead of `<->`.
* Add custom entry `dfrac` that can be used for `{dq}` / `□` / `{# q}`
annotation of connectives with a discardable fraction.
* Add an RA on the `Z` type of integers, using addition for `⋅`.
* Prepare Iris to generalize the type of step-indices. This is a large series of
changes; more changes will follow later. More documentation will follow as
part of
[this merge request](https://gitlab.mpi-sws.org/iris/iris/-/merge_requests/888).
- Change the definition of `dist_later` to an equivalent definition that is
future-proof with respect to general step-indices.
- Change the definition of the properties of an `ofe` to be slightly more
general and future proof (i.e., change `dist_S` into `dist_lt`).
- Adapt `f_contractive` to work with the new definition of `dist_later`.
For backwards compatibility for existing developments, the tactic
`f_contractive_fin` is provided. It uses the old definition of `dist_later`,
now called `dist_later_fin`.
- If you need to deal with a `dist_later`/`dist_later_fin` in a manual proof,
use the tactic `dist_later_intro`/`dist_later_fin_intro` to introduce it.
(by Michael Sammler, Lennard Gäher, and Simon Spies)
* Add `max_Z` and `mono_Z` cameras.
* Add `dfrac_valid`.
* Rename `Some_included_2` to `Some_included_mono`.
* Consistently use `Some x ≼ Some y` to express the reflexive closure of
`x ≼ y`. This changes the statements of some lemmas: `singleton_included`,
`local_update_valid0`, `local_update_valid`. Also add various new
`Some_included` lemmas to help deal with these assertions.
* Add hints for `a ≼ a ⋅ _` / `a ≼ _ ⋅ a` / `ε ≼ _` / `_ ≼ CsumBot` /
`_ ≼ ExclBot` with cost 0, which means they are used by `done` to finish
proofs. (by Ike Mulder)
* Rename `singleton_mono` to `singleton_included_mono`.
* Use `Strategy expand` for CMRA/UCMRA coercions and most projections to improve
performance of type-checking some large CMRA/OFE types. (by Ike Mulder)
* Add monotone resource algebra, `algebra/mra.v`, to enable reasoning about
monotonicity with respect to an arbitrary preorder relation: the extension order
of `mra R` is designed to embed the preorder relation `R`. (by Amin Timany)
* Rename instances `union_with_proper``union_with_ne`,
`map_fmap_proper``map_fmap_ne`, `map_zip_with_proper``map_zip_with_ne`.
* Rename `dist_option_Forall2``option_dist_Forall2`. Add similar lemma
`list_dist_Forall2`.
* Add instances `option_fmap_dist_inj` and `list_fmap_dist_inj`.
* Rename `list_dist_cons_inv_r``cons_dist_eq` and remove
`list_dist_cons_inv_l` to be consistent with `cons_equiv_eq` in std++.
(If you needed `list_dist_cons_inv_l`, you can apply `symmetry` and
then use `cons_dist_eq`.)
Add similar lemmas `nil_dist_eq`, `app_dist_eq`, `list_singleton_dist_eq`,
`dist_Permutation`.
**Changes in `bi`:**
* Use `binder` in notations for big ops. This means one can write things such
as `[∗ map] '(k,_) ↦ '(_,y) ∈ m, ⌜ k = y ⌝`.
* Add constructions `bi_tc`/`bi_nsteps` to create the transitive/`n`-step
closure of a PROP-level binary relation. (by Simcha van Collem)
* Make the `unseal` tactic of `monPred` more consistent with `uPred`:
+ Rename `MonPred.unseal``monPred.unseal`
+ No longer unfold derived BI connectives `<affine>`, `<absorb>` and `◇`.
* Make `monPred.unseal` tactic more robust by using types to unfold the right
BI projections.
* Add `unseal` tactic for `siProp`.
* Add compatibility lemmas for `big_sepL <-> big_sepL2`, `big_sepM <-> big_sepM2`
with list/maps of pairs; and `big_sepM <-> big_sepL` via `list_to_map` and
`map_to_list`. (by Dorian Lesbre)
* Make `persistently_True` a bi-entailment; this changes the default `rewrite`
direction.
* Make `BiLaterContractive` a class instead of a notation.
* Make projections of `Bupd`/`Fupd`/`InternalEq`/`Plainly` operational type
classes `Typeclasses Opaque`.
* Make BI relations (`bi_rtc`, `bi_tc`, `bi_nsteps`) typeclasses opaque (they
were accidentally transparent).
* Make the `P -∗ Q` notation in stdpp_scope (i.e., outside of bi_scope) a
shorthand for `⊢ P -∗ Q` rather than `P ⊢ Q`. This means that any BI notation
used in stdpp_scope will be sugar for adding a leading `⊢` (`bi_emp_valid`).
It also means that `apply` becomes sensitive to the difference between `P ⊢ Q`
and `P -∗ Q`, and `rewrite` will only work with lemmas that are explicitly
written using `⊢`.
When a proof breaks, there are generally 3 options:
- Try to find the `-∗` that should be turned into a `⊢` so that things work
like before.
- Adjust the proof to use proof mode tactics rather than Coq tactics (in
particular, replace `apply` by `iApply`).
- Add some `apply bi.entails_wand`/`apply bi.wand_entails` to 'convert'
between the old and new way of interpreting `P -∗ Q`.
* Add `auto` hint to introduce the BI version of `↔`.
* Change `big_sepM2_alt` to use `dom m1 = dom2 m2` instead of
`∀ k, is_Some (m1 !! k) ↔ is_Some (m2 !! k)`. The old lemma is still
available as `big_sepM2_alt_lookup`.
* Overhaul `Fractional`/`AsFractional`:
- Remove `AsFractional → Fractional` instance.
- No longer use `AsFractional P Φ q` backwards, from `Φ` and `q` to `P` -- just
use `Φ q` instead.
- Remove multiplication instances (that also go from `AsFractional` to
`Fractional`, making it very hard to reason about search termination).
- Rewrite `frame_fractional` lemma using the new `FrameFractionalQp` typeclass
for `Qp` reasoning.
- Change statements of `fractional_split`, `fractional_half`, and
`fractional_merge` to avoid using `AsFractional` backwards, and only keep
the bi-directional versions (remove `fractional_split_1`,
`fractional_split_2`, `fractional_half_1`, `fractional_half_2`).
`iDestruct`/`iCombine`/`iSplitL`/`iSplitR` should be used instead.
* Add missing transitivity, symmetry and reflexivity lemmas about the `↔`, `→`,
`-∗` and `∗-∗` connectives. (by Ike Mulder)
* Add `∗-∗` as notation in `stdpp_scope` similar to `-∗`. This means `P ∗-∗ Q`
can be directly used as lemma statement, and is syntactic sugar for `⊢ P ∗-∗ Q`.
* Add `≼` connective (`internal_included`) on the BI level. (by Ike Mulder)
* Move laws of persistence modality out of `BiMixin` into `BiPersistentlyMixin`.
* Provide smart constructor `bi_persistently_mixin_discrete` for
`BiPersistentlyMixin`: Given a discrete BI that enjoys the existential
property, a trivial definition of the persistence modality can be given.
* Fix `greatest_fixpoint_ne'` accidentally being about the least fixpoint.
* Add `Plain` instance for `|==> P` when `P` is plain.
* Rename `bupd_plain``bupd_elim`.
* Change notation for atomic updates and atomic accessors to use `<{ ... }>`
instead of `<< ... >>`. This avoids a conflict with Autosubst.
**Changes in `proofmode`:**
* The proof mode introduction patterns "<-" and "->" are considered
intuitionistic. This means that tactics such as `iDestruct ... as "->"` will
not dispose of hypotheses to perform the rewrite.
* Remove tactic `iSolveTC` in favor of `tc_solve` in std++.
* The result of `iCombine` is no longer computed with the `FromSep` typeclass,
but with a new `CombineSepAs` typeclass. If you provide custom `FromSep`
instances and use the `iCombine` tactic, you will need to define additional
`CombineSepAs` instances. This is done in preparation for making `iCombine`
combine propositions in ways that are not appropriate for how `FromSep` is used.
Note that `FromSep` is still used for determining the new goals when applying
the `iSplitL` and `iSplitR` tactics.
* The `iCombine` tactic now accepts an (optional) 'gives' clause, with which one
can learn persistent facts from the combination of two hypotheses. One can
register such 'gives' clauses by providing instances of the new
`CombineSepGives` typeclass. The 'gives' clause is still experimental;
in future versions of Iris it will combine `own` connectives based on the
validity rules for cameras.
* Make sure that `iStartProof` fails with a proper error message on goals with
`let`. These `let`s should either be `simpl`ed or introduced into the Coq
context using `intros x`, `iIntros (x)`, or `iIntros "%x"`.
This can break some proofs that did `iIntros "?"` on a goal of the shape
`let ... in P ⊢ Q`.
* Make `iApply`/`iPoseProof`/`iDestruct` more reliable for lemmas whose
statement involves `let`.
* Remove `string_to_ident`; use `string_to_ident_cps` instead which is in CPS
form and hence does not require awful hacks.
* The `iFrame` tactic now removes some conjunctions and disjunctions with `False`,
since additional `MakeOr` and `MakeAnd` instances were provided. If you use these
classes, their results may have become more concise.
* Support n-ary versions of `iIntros`, `iRevert`, `iExists`, `iDestruct`, `iMod`,
`iFrame`, `iRevertIntros`, `iPoseProof`, `iInduction`, `iLöb`, `iInv`, and
`iAssert`. (by Jan-Oliver Kaiser and Rodolphe Lepigre)
* Add tactics `ltac1_list_iter` and `ltac1_list_rev_iter` to iterate over
lists of `ident`s/`simple intropatterns`/`constr`/etc using Ltac1. See
[proofmode/base.v](iris/proofmode/base.v) for documentation on how
to use these tactics to convert your own fixed arity tactics to an n-ary
variant.
* Improve the `IntoPure` instance for internal equality. Whenever possible,
`a ≡ b` will now be simplified to `a = b` upon introduction into the pure
context. This will break but simplify some existing proofs:
`iIntros (H%leibniz_equiv)` should be replaced by `iIntros (H)`. (by Ike Mulder)
**Changes in `base_logic`:**
* Add `mono_Z` library for monotone non-negative integers.
(This has exactly the same lemmas as `mono_nat`. It is useful in cases
where one wants to avoid `nat` entirely and use `Z` throughout.)
* Add `IsExcept0` instance for invariants, allowing you to remove laters of
timeless hypotheses when proving an invariant (without an update).
* Make `uPred.unseal` tactic more robust by using types to unfold the right
BI projections.
* Turn `internal_eq_entails` into a bi-implication.
* Add lemmas to relate internal/external non-expansiveness and contractiveness.
* Refactor soundness lemmas: `bupd_plain_soundness``bupd_soundness`,
`soundness``laterN_soundness` + `pure_soundness`; removed
`consistency_modal`.
* Strengthen `cmra_valid_elim` to `✓ a ⊢ ⌜ ✓{0} a ⌝`; make `discrete_valid` a
derived law.
* Remove `frac_validI`. Instead, move to the pure context (with `%` in the proof
mode or `uPred.discrete_valid` in manual proofs) and use `frac_valid`.
**Changes in `program_logic`:**
* Change the notation for logically atomic triples: we add support for specifying private (non-atomic) postconditions,
and we avoid a notation conflict with Autosubst. The new notation looks as follows:
`<<{ ∀∀ x, atomic_pre x }>> code @ ∅ <<{ ∃∃ y, atomic_post x y | z, RET v, non_atomic_post x y z }>>`.
To keep the notation without private postcondition consistent, the way the return value is specified changes slightly
even when there is no private postcondition:
`<<{ ∀∀ x, atomic_pre x }>> code @ ∅ <<{ ∃∃ y, atomic_post x y | RET v }>>`.
**Changes in `heap_lang`:**
* Move operations and lemmas about locations into a module `Loc`.
* Extend `wp_apply` and `wp_smart_apply` to support immediately introducing the
postcondition into the context via `as (x1 ... xn) "ipat1 ... ipatn"`.
* Add comparison `≤` and `<` for locations. (by Arthur Azevedo de Amorim)
* Make the generic `lock` interface a typeclass and make sure the lock code
does not depend on `Σ`. Code that is generic about lock implementations, or
that instantiates that specification, needs adjustment. See
[iris_heap_lang/lib/lock.v](iris_heap_lang/lib/lock.v) for documentation on
how to work with this specification.
* Adjust the generic `atomic_heap` interface to follow the same pattern as
`lock`.
* Add a generic `rwlock` interface and a spinning implementation.
(by Isaac van Bakel)
**LaTeX changes:**
- Rename `\Alloc` to `\AllocN` and `\Ref` to `\Alloc` for better consistency
with the Coq names and to avoid clash with hyperref package.
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
# iSolveTC
s/iSolveTC\b/tc_solve/g
# _alt -> _def
s/\bsig_equiv_alt\b/sig_equiv_def/g
s/\bsig_dist_alt\b/sig_dist_def/g
# Loc
s/\bloc_add(_assoc|_0|_inj|)\b/Loc.add\1/g
s/\bfresh_locs(_fresh|)\b/Loc.fresh\1/g
# unseal
s/\bMonPred\.unseal\b/monPred\.unseal/g
# big op
s/\bbig_sepM2_alt\b/big_sepM2_alt_lookup/g
s/\bbupd_plain\b/bupd_elim/g
# Logical atomicity (will break Autosubst notation!)
s/<<</<<\{/g
s/>>>/\}>>/g
# option and list
s/\bdist_option_Forall2\b/option_dist_Forall2/g
s/\blist_dist_cons_inv_r\b/cons_dist_eq/g
EOF
```
The following sed script helps adjust LaTeX documents to these changes:
Note that the script is not idempotent, do not run it twice.
```
sed -i -E -f- *.tex <<EOF
# Alloc & Ref
s/\\Alloc\b/\\AllocN/g
s/\\Ref\b/\\Alloc/g
EOF
```
## Iris 4.0.0 (2022-08-18)
The highlight of Iris 4.0 is the *later credits* mechanism, which provides a new
way to eliminate later modalities.
This new mechanism complements the existing techniques of taking program steps,
exploiting timelessness, and various modality commuting rules. At each program
step, one obtains a credit `£ 1`, which is an ownable Iris resource. These
credits don't have to be used at the present step, but can be saved up, and used
to eliminate laters at any point in the verification using the fancy update
modality. Later credits are particularly useful in proofs where there is not a
one-to-one correspondence between program steps and later eliminations, for
example, logical atomicity proofs. As a consequence, we have been able to
simplify the definition of logical atomicity by removing the 'laterable'
mechanism.
The later credit mechanism is described in detail in the
[ICFP'22 paper](https://plv.mpi-sws.org/later-credits/) and there is a
[small tutorial](https://gitlab.mpi-sws.org/iris/iris/-/blob/iris-4.0.0/tests/later_credits_paper.v)
in the Iris repository. The
[examples](https://gitlab.mpi-sws.org/iris/examples/) repository contains some
logically atomic case studies that make use of later credits: the counter with a
backup (Section 4 of the later credits paper), as well as the elimination stack,
conditional increment, and RDCSS.
Iris 4.0 supports Coq 8.13 - 8.16.
This release was managed by Ralf Jung, Robbert Krebbers, and Lennard Gäher, with
contributions from Glen Mével, Gregory Malecha, Ike Mulder, Irene Yoon,
Jan-Oliver Kaiser, Jonas Kastberg Hinrichsen, Lennard Gäher, Michael Sammler,
Niklas Mück, Paolo G. Giarrusso, Ralf Jung, Robbert Krebbers, Simon Spies,
and Tej Chajed. Thanks a lot to everyone involved!
**General changes:**
- Rename "unsealing" lemmas from `_eq` to `_unseal`. This particularly
affects `envs_entails_eq`, which is commonly used in the definition of
custom proof mode tactics. All other unsealing lemmas should be internal, so
in principle you should not rely on them.
- Rename `coq-iris-staging` package to `coq-iris-unstable`, and also change the
import path from `iris.staging` to `iris.unstable`.
**Changes in `algebra`:**
* Add some missing algebra functors: `dfrac_agreeRF`, `excl_authURF`, `excl_authRF`,
`frac_authURF`, `frac_authRF`, `ufrac_authURF`, `ufrac_authRF`, `max_prefix_listURF`,
`max_prefix_listRF`, `mono_listURF`, and `mono_listRF`.
* Make validy lemmas for `excl_auth` more consistent with `auth`.
- Rename `excl_auth_frag_validN_op_1_l` into `excl_auth_frag_op_validN` and
`excl_auth_frag_valid_op_1_l` into `excl_auth_frag_op_valid` (similar to
`auth_auth_op_valid`), and make them bi-implications.
- Add `excl_auth_auth_op_validN` and `excl_auth_auth_op_valid`.
* Make validy lemmas for `(u)frac_auth` more consistent with `auth`.
- Remove unidirectional lemmas with `1` fraction `frac_auth_frag_validN_op_1_l`
and `frac_auth_frag_valid_op_1_l`
- Add `frac_auth_frag_op_validN` and `frac_auth_frag_op_valid`, which are
bi-implications with arbitrary fractions.
- Add `ufrac_auth_frag_op_validN` and `ufrac_auth_frag_op_valid`.
* Remove `mono_list_lb_is_op` instance for `IsOp' (◯ML l) (◯ML l) (◯ML l)`; we
don't usually have such instances for duplicable resources and it was added by
accident.
* Rename `pos_op_plus` into `pos_op_add`.
**Changes in `bi`:**
We also split Iris into multiple opam packages: `coq-iris` no longer contains * Generalize `big_op` lemmas that were previously assuming `Absorbing`ness of
HeapLang, which is now in a separate package `coq-iris-heap-lang`. some assertion: they now take any of (`TCOr`) an `Affine` instance or an
`Absorbing` instance. This breaks uses where an `Absorbing` instance was
provided without relying on TC search (e.g. in `by apply ...`; a possible fix
is `by apply: ...`). (by Glen Mével, Bedrock Systems)
* Change statement of `affinely_True_emp` to also remove the affinely modality.
* Rename `absorbingly_True_emp` to `absorbingly_emp_True` and make statement
consistent with `affinely_True_emp`: `<absorb> emp ⊣⊢ True`.
* Change the notation for atomic updates and atomic accessors (`AU`, `AACC`) to
swap the quantifiers: the first quantifier is logically an existential, the
second a universal, so let's use the appropriate notation. Also use double
quantifiers (`∀∀`, `∃∃`) to make it clear that these are not normal
quantifiers (the latter change was also applied to logically atomic triples).
* Add some lemmas to show properties of functions defined via monotonoe fixpoints:
`least_fixpoint_affine`, `least_fixpoint_absorbing`,
`least_fixpoint_persistent_affine`, `least_fixpoint_persistent_absorbing`,
`greatest_fixpoint_absorbing`.
* Rename `laterN_plus` into `laterN_add`.
* Remove `make_laterable` from atomic updates. This relies on Iris now having
support for later credits (see below).
* Add `Fractional` and `AsFractional` instances for `embed` such that the
embedding of something fractional is also fractional. (by Simon Friis Vindum).
**Changes in `proofmode`:**
* Change `iAssumption` to no longer instantiate evar premises with `False`. This
used to occur when the conclusion contains variables that are not in scope of
the evar, thus blocking the default behavior of instantiating the premise with
the conclusion. The old behavior can be emulated with`iExFalso. iExact "H".`
* In `iInduction`, support induction schemes that involve `Forall` and
`Forall2` (for example, for trees with finite branching).
* Change `iRevert` of a pure hypothesis to generate a magic wand instead of an
implication.
* Change `of_envs` such that when the persistent context is empty, the
persistence modality no longer appears at all. This is a step towards using
the proofmode in logics without a persistence modality.
The lemma `of_envs_alt` shows equivalence with the old version.
* Adjust `IntoWand` instances for non-affine BIs: in many cases where
`iSpecialize`/`iApply` of an implication previously failed, it will now
instead add an `<affine>` modality to the newly generated goal. In some rare
cases it might stop working or add an `<affine>` modality where previously
none was added.
**Changes in `base_logic`:**
* Make the `inG` instances for `libG` fields local, so they are only used inside
the library that defines the `libG`.
* Add infrastructure for supporting later credits, by adding a resource `£ n`
describing ownership of `n` credits that can be eliminated at fancy updates.
+ To retain backwards compatibility with the interaction laws of fancy updates
with the plainly modality (`BiFUpdPlainly`), which are incompatible with
later credits, the logic has a new parameter of type `has_lc`, which is
either `HasLc` or `HasNoLc`. The parameter is an index of the `invGS_gen`
typeclass; the old `invGS` is an alias for `invGS_gen HasLc` so that
developments default to having later credits available. Libraries that want
to be generic over whether credits are available or not, and proofs that
need `BiFUpdPlainly`, need to be changed to use `invGS_gen` rather than
`invGS`.
+ The core soundness lemma `step_fupdN_soundness_gen` similarly takes a `has_lc`
parameter to control how the logic is supposed to be instantiated. The lemma
always generates credits, but they cannot be used in any meaningful way unless
`HasLc` is picked.
* Add discardable fractions `dfrac` to `saved_anything_own`, `saved_prop_own`,
and `saved_pred_own`, so they can be updated. The previous persistent versions
can be recovered with the fraction `DfracDiscarded`. Allocation lemmas now take
a `dq` parameter to define the initial fraction.
* Remove an unused fraction argument to `dfrac_valid_discarded`.
**Changes in `program_logic`:**
* The definition of the weakest precondition has been changed to generate later credits
(see `base_logic`) for each step:
+ The member `num_laters_per_step` of the `irisGS` class now also determines the number
of later credits that are generated: `S (num_laters_per_step ns)` if `ns` steps
have been taken.
+ The weakest precondition offers credits after a `prim_step` has been proven.
+ All lifting lemmas have been altered to provide credits.
`wp_lift_step_fupdN` provides `S (num_laters_per_step ns)` credits, while all other
lemmas always provide one credit.
* In line with the support for later credits (see `base_logic`), `irisGS_gen`
now also has a `has_lc` parameter and the adequacy statements have been
changed to account for that:
+ The lemma `twp_total` (total adequacy) provides `irisGS_gen HasNoLc`. Clients
of the adequacy proof will need to make sure to be either generic over the
choice of `has_lc` or explicitly opt-out of later credits.
+ The adequacy lemmas for the partial WP, in particular `wp_adequacy`,
`wp_strong_adequacy` and `wp_invariance`, are now available in two flavors:
the old names generate `irisGS` (a short-hand for `irisGS_gen HasLc`); new
lemmas with a `_gen` suffix leave the choice of `has_lc` to the user.
+ The parameter for the stuckness bit `s` in `wp_strong_adequacy{_lc, _no_lc}` has
moved up and is now universally quantified in the lemma instead of being existentially
quantified at the Iris-level. For clients that already previously quantified over `s`
at the Coq level, the only required change should be to remove the instantiation
of the existential quantifier.
**Changes in `iris_heap_lang`:**
* Change the `num_laters_per_step` of `heap_lang` to `λ n, n`, signifying that
each step of the weakest precondition strips `n` laters, where `n` is the
number of steps taken so far. This number is tied to ghost state in the state
interpretation, which is exposed, updated, and used with new lemmas
`wp_lb_init`, `wp_lb_update`, and `wp_step_fupdN_lb`. (by Jonas Kastberg Hinrichsen)
* Make pattern argument of `wp_pure` tactic optional (defaults to wildcard
pattern, matching all redexes).
* In line with the support for later credits (see `base_logic`), the tactic
`wp_pure` now takes an optional parameter `credit:"H"` which generates a
hypothesis `H` for a single later credit `£ 1` that can be eliminated using
`lc_fupd_elim_later`.
The typeclass `heapGS_gen` now takes an additional `has_lc` parameter, and
`heapGS` is a short-hand for `heapGS_gen HasLc`. The adequacy statements for
HeapLang have been changed accordingly:
+ `heap_adequacy` provides `heapGS`, thus enabling the use of later credits.
This precludes usage of the laws in `BiFUpdPlainly` in the HeapLang instance of Iris.
+ `heap_total` provides `heapGS_gen HasNoLc`.
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
# excl_auth
s/\bexcl_auth_frag_validN_op_1_l\b/excl_auth_frag_op_validN/g
s/\bexcl_auth_frag_valid_op_1_l\b/excl_auth_frag_op_valid/g
# staging → unstable
s/\biris\.staging\b/iris.unstable/g
# plus → add
s/\blaterN_plus\b/laterN_add/g
s/\bpos_op_plus\b/pos_op_add/g
EOF
```
## Iris 3.6.0 (2022-01-22)
The highlights and most notable changes of this release are:
* Coq 8.15 is now supported, while Coq 8.13 and Coq 8.14 remain supported.
Coq 8.12 is no longer supported.
* Support for discardable fractions (`dfrac`) has been added to `gmap_view`
authoritative elements, and to the `mono_nat` library. See below for other
`dfrac`-related changes.
* A new `mono_list` algebra provides monotonically growing lists with an
exclusive authoritative element and persistent prefix witnesses. See
`iris/algebra/lib/mono_list.v` for details. An experimental logic-level
library wrapping the algebra is available at
`iris_staging/base_logic/mono_list.v`; if you use it, please give feedback on
the tracking issue
[iris/iris#439](https://gitlab.mpi-sws.org/iris/iris/-/issues/439).
This release was managed by Ralf Jung, Robbert Krebbers, and Tej Chajed, with
contributions from Dan Frumin, Jonas Kastberg Hinrichsen, Lennard Gäher,
Matthieu Sozeau, Michael Sammler, Paolo G. Giarrusso, Ralf Jung, Robbert
Krebbers, Simon Friis Vindum, Tej Chajed, and Vincent Siles. Thanks a lot to
everyone involved!
**Changes in `algebra`**
* Define non-expansive instance for `dom`. This, in particular, makes it
possible to `iRewrite` below `dom` (even if the `dom` appears in `⌜ _ ⌝`).
* Generalize the authoritative elements of `gmap_view` to be parameterized by a
[discardable fraction](iris/algebra/dfrac.v) (`dfrac`) instead of a fraction
(`frac`). Lemmas affected by this have been renamed such that the "frac" in
their name has been changed into "dfrac". (by Simon Friis Vindum)
* Change `ufrac_auth` notation to not use curly braces, since these fractions do
not behave like regular fractions (and cannot be made `dfrac`).
Old: `●U{q} a`, `◯U{q} b`; new: `●U_q a`, `◯U_q b`.
* Equip `frac_agree` with support for `dfrac` and rename it to `dfrac_agree`.
The old `to_frac_agree` and its lemmas still exist, except that the
`frac_agree_op_valid` lemmas are made bi-directional.
* Rename typeclass instance `Later_inj` -> `Next_inj`.
* Remove `view_auth_frac_op`, `auth_auth_frac_op`, `gmap_view_auth_frac_op`; the
corresponding `dfrac` lemmas can be used instead (together with `dfrac_op_own`
if needed).
* Equip `mono_nat` algebra with support for `dfrac`, make API more consistent,
and add notation for algebra elements. See `iris/algebra/lib/mono_nat.v` for
details. This affects some existing terms and lemmas:
- `mono_nat_auth` now takes a `dfrac`, but the recommendation is to port to the notation.
- `mono_nat_lb_op`: direction of equality is swapped.
- `mono_nat_auth_frac_op`, `mono_nat_auth_frac_op_valid`,
`mono_nat_auth_frac_valid`, `mono_nat_both_frac_valid`: use `dfrac` variant
instead.
* Add `mono_list` algebra for monotonically growing lists with an exclusive
authoritative element and persistent prefix witnesses. See
`iris/algebra/lib/mono_list.v` for details.
**Changes in `bi`:**
* Rename `least_fixpoint_ind` into `least_fixpoint_iter`,
rename `greatest_fixpoint_coind` into `greatest_fixpoint_coiter`,
rename `least_fixpoint_strong_ind` into `least_fixpoint_ind`,
add lemmas `least_fixpoint_{ind_wf, ne', strong_mono}`, and
add lemmas `greatest_fixpoint_{coind, paco, ne', strong_mono}`.
* Move `persistently_forall_2` (`∀ <pers> ⊢ <pers> ∀`) out of the BI interface
into a new typeclass, `BiPersistentlyForall`. The BI interface instead just
demands the equivalent property for conjunction (`(<pers> P) ∧ (<pers> Q) ⊢
<pers> (P ∧ Q)`). This enables the IPM to support logics where the
persistently modality is defined with an existential quantifier. This also
necessitates removing `persistently_impl_plainly` from `BiPlainly` into a new
typeclass `BiPersistentlyImplPlainly`.
Proofs that are generic in `PROP` might have to add those new classes as
assumptions to remain compatible, and code that instantiates the BI interface
needs to provide instances for the new classes.
* Make `frame_fractional` not an instance any more; instead fractional
propositions that want to support framing are expected to register an
appropriate instance themselves. HeapLang and gen_heap `↦` still support
framing, but the other fractional propositions in Iris do not.
* Strengthen the `Persistent`/`Affine`/`Timeless` results for big ops. Add a `'`
to the name of the weaker results, which remain to be used as instances.
**Changes in `heap_lang`:**
* The `is_closed_expr` predicate is formulated in terms of a
set of binders (as opposed to a list of binders).
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
# least/greatest fixpoint renames
s/\bleast_fixpoint_ind\b/least_fixpoint_iter/g
s/\bgreatest_fixpoint_coind\b/greatest_fixpoint_coiter/g
s/\bleast_fixpoint_strong_ind\b/least_fixpoint_ind/g
# gmap_view renames from frac to dfrac
s/\bgmap_view_(auth|both)_frac_(op_invN|op_inv|op_inv_L|valid|op_validN|op_valid|op_valid_L)\b/gmap_view_\1_dfrac_\2/g
s/\bgmap_view_persist\b/gmap_view_frag_persist/g
# frac_agree with dfrac
s/\bfrac_agreeR\b/dfrac_agreeR/g
EOF
```
## Iris 3.5.0 (2021-11-05)
The highlights and most notable changes of this release are:
* Coq 8.14 is now supported, while Coq 8.12 and Coq 8.13 remain supported.
* The proof mode now has native support for pure names `%H` in intro patterns,
without installing
[iris/string-ident](https://gitlab.mpi-sws.org/iris/string-ident). If you had
the plugin installed, to migrate simply uninstall the plugin and stop
importing it.
* The proof mode now supports destructing existentials with the `"[%x ...]"`
pattern.
* `iMod` and `iModIntro` now report an error message for mask mismatches.
* Performance improvements for the proof mode in `iFrame` in non-affine
logics, `iPoseProof`, and `iDestruct` (by Paolo G. Giarrusso, Bedrock Systems,
and Armaël Guéneau).
* The new `ghost_map` logic-level library supports a ghost `gmap K V` with an
authoritative view and per-element points-to facts written `k ↪[γ] w`.
* Weakest preconditions now support a flexible number of laters per
physical step of the operational semantics. See merge request
[!585](https://gitlab.mpi-sws.org/iris/iris/-/merge_requests/595) (by
Jacques-Henri Jourdan and Yusuke Matsushita).
* HeapLang now has an atomic `Xchg` (exchange) operation (by Simon Hudon,
Google).
This release was managed by Ralf Jung, Robbert Krebbers, and Tej Chajed, with
contributions from Amin Timany, Armaël Guéneau, Dan Frumin, Dmitry Khalanskiy,
Hoang-Hai Dang, Jacques-Henri Jourdan, Lennard Gäher, Michael Sammler, Paolo G.
Giarrusso, Ralf Jung, Robbert Krebbers, Simon Friis Vindum, Simon Hudon, Tej
Chajed, and Yusuke Matsushita. Thanks a lot to everyone involved!
**Changes in `algebra`:**
* Generalize the authoritative elements of the `view`, `auth` and `gset_bij`
cameras to be parameterized by a [discardable fraction](iris/algebra/dfrac.v)
(`dfrac`) instead of a fraction (`frac`). Normal fractions are now denoted
`●{#q} a` and `●V{#q} a`. Lemmas affected by this have been renamed such that
the "frac" in their name has been changed into "dfrac". (by Simon Friis Vindum)
* Generalize `namespace_map` to `reservation_map` which enhances `gmap positive
A` with a notion of 'tokens' that enable allocating a particular name in the
map. See [algebra.reservation_map](iris/algebra/reservation_map.v) for further
information.
* Add `dyn_reservation_map` which further extends `reservation_map` with the
ability to dynamically allocate an infinite set of tokens. This is useful to
perform synchronized allocation of the same name in two maps/APIs without
dedicated support from one of the involved maps/APIs. See
[algebra.dyn_reservation_map](iris/algebra/dyn_reservation_map.v) for further
information.
* Demote the Camera structure on `list` to `iris_staging` since its composition
is not very well-behaved.
* Extend `gmap_view` with lemmas for "big" operations on maps.
* Typeclasses instances triggering a canonical structure search such as `Equiv`,
`Dist`, `Op`, `Valid`, `ValidN`, `Unit`, `PCore` now use an `Hint Extern`
based on `refine` instead of `apply`, in order to use Coq's newer unification
algorithm.
* Set `Hint Mode` for the classes `OfeDiscrete`, `Dist`, `Unit`, `CmraMorphism`,
`rFunctorContractive`, `urFunctorContractive`.
* Set `Hint Mode` for the stdpp class `Equiv`. This might require few spurious
type annotations until
[Coq bug #14441](https://github.com/coq/coq/issues/14441) is fixed.
* Add `max_prefix_list` RA on lists whose composition is only defined when one
operand is a prefix of the other. The result is the longer list.
* Add `NonExpansive` instances for `curry` and friends.
**Changes in `bi`:**
* Add new lemmas `big_sepM2_delete_l` and `big_sepM2_delete_r`.
* Rename `big_sepM2_lookup_1``big_sepM2_lookup_l` and
`big_sepM2_lookup_2``big_sepM2_lookup_r`.
* Add lemmas for swapping nested big-ops: `big_sep{L,M,S,MS}_sep{L,M,S,MS}`.
* Rename `big_sep{L,L2,M,M2,S}_intuitionistically_forall`
`big_sep{L,L2,M,M2,S}_intro`, and `big_orL_lookup``big_orL_intro`.
* Rename `bupd_forall` to `bupd_plain_forall`, and add
`{bupd,fupd}_{and,or,forall,exist}`.
* Decouple `Wp` and `Twp` typeclasses from the `program_logic.language`
interface. The typeclasses are now parameterized over an expression and a
value type, instead of a language. This requires extra type annotations or
explicit coercions in a few cases, in particular `WP v {{ Φ }}` must now be
written `WP (of_val v) {{ Φ }}`.
* Improve `make_laterable`:
- Adjust definition such that `Laterable P` iff `P ⊢ make_laterable P`.
As a consequence, `make_laterable_elim` got weaker: elimination now requires
an except-0 modality (`make_laterable P -∗ ◇ P`).
- Add `iModIntro` support for `make_laterable`.
* Improvements to `BiMonoPred`:
- Use `□`/`-∗` instead of `<pers>`/`→`.
- Strengthen to ensure that functions for recursive calls are non-expansive.
* Add `big_andM` (big conjunction on finite maps) with lemmas similar to `big_andL`.
* Add transitive embedding that constructs an embedding of `PROP1` into `PROP3`
by combining the embeddings of `PROP1` into `PROP2` and `PROP2` into `PROP3`.
This construct is *not* declared as an instance to avoid TC search divergence.
(by Hai Dang, BedRock Systems)
* Improve notation printing around magic wands, view shifts, `WP`, Texan
triples, and logically atomic triples.
* Slight change to the `AACC` notation for atomic accessors (which is usually
only printed, not parsed): added a `,` before `ABORT`, for consistency with `COMM`.
* Add the lemmas `big_sepM_impl_strong` and `big_sepM_impl_dom_subseteq` that
generalize the existing `big_sepM_impl` lemma. (by Simon Friis Vindum)
* Add new instance `fractional_big_sepL2`. (by Paolo G. Giarrusso, BedRock Systems)
**Changes in `proofmode`:**
* Add support for pure names `%H` in intro patterns. This is now natively
supported whereas the previous experimental support required installing
https://gitlab.mpi-sws.org/iris/string-ident. (by Tej Chajed)
* Add support for destructing existentials with the intro pattern `[%x ...]`.
(by Tej Chajed)
* `iMod`/`iModIntro` show proper error messages when they fail due to mask
mismatches. To support this, the proofmode typeclass `FromModal` now takes an
additional pure precondition.
* Fix performance of `iFrame` in logics without `BiAffine`.
To adjust your code if you use such logics and define `Frame` instances,
ensure these instances to have priority at least 2: they should have either at
least 2 (non-dependent) premises, or an explicit priority.
References: docs for `frame_here_absorbing` in
[iris/proofmode/frame_instances.v](iris/proofmode/frame_instances.v) and
https://coq.inria.fr/refman/addendum/type-classes.html#coq:cmd.Instance. (by
Paolo G. Giarrusso, BedRock Systems)
* Rename the main entry point module for the proofmode from
`iris.proofmode.tactics` to `iris.proofmode.proofmode`. Under normal
circumstances, this should be the only proofmode file you need to import.
* Improve performance of the `iIntoEmpValid` tactic used by `iPoseProof`,
especially in the case of large goals and lemmas with many forall quantifiers.
(by Armaël Guéneau)
* Improve performance of the `iDestruct` tactic, by using user-provided names
more eagerly in order to avoid later calls to `iRename`.
(by Armaël Guéneau)
**Changes in `bi`:**
* Add lemmas characterizing big-ops over pure predicates (`big_sep*_pure*`).
* Move `BiAffine`, `BiPositive`, `BiLöb`, and `BiPureForall` from
`bi.derived_connectives` to `bi.extensions`.
* Strengthen `persistent_fractional` to support propositions that are persistent
and either affine or absorbing. (by Paolo G. Giarrusso, BedRock Systems)
**Changes in `base_logic`:**
* Add `ghost_map`, a logic-level library for a `gmap K V` with an authoritative
view and per-element points-to facts written `k ↪[γ] w`.
* Generalize the soundness lemma of the base logic `step_fupdN_soundness`.
It applies even if invariants stay open across an arbitrary number of laters.
(by Jacques-Henri Jourdan)
* Rename those `*G` typeclasses that must be global singletons to `*GS`, and
their corresponding `preG` class to `GpreS`. Affects `invG`, `irisG`,
`gen_heapG`, `inv_heapG`, `proph_mapG`, `ownPG`, `heapG`.
**Changes in `program_logic`:**
* Change definition of weakest precondition to use a variable number of laters
(i.e., logical steps) for each physical step of the operational semantics,
depending on the number of physical steps executed since the beginning of the
execution of the program. See merge request [!595](https://gitlab.mpi-sws.org/iris/iris/-/merge_requests/595).
This implies several API-breaking changes, which can be easily fixed in client
formalizations in a backward compatible manner as follows:
- Ignore the new parameter `ns` in the state interpretation, which
corresponds to a step counter.
- Use the constant function "0" for the new field `num_laters_per_step` of
`irisG`.
- Use `fupd_intro _ _` for the new field `state_interp_mono` of `irisG`.
- Some proofs using lifting lemmas and adequacy theorems need to be adapted
to ignore the new step counter.
(by Jacques-Henri Jourdan)
* Remove `wp_frame_wand_l`; add `wp_frame_wand` as more symmetric replacement.
* Swap the polarity of the mask in logically atomic triples, so that it matches
regular `WP` masks.
* Rename `iris_invG` to `iris_invGS`.
**Changes in `heap_lang`:**
* Rename `Build_loc` constructor for `loc` type to `Loc`.
* Add atomic `Xchg` ("exchange"/"swap") operation. (by Simon Hudon, Google LLC)
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
# auth and view renames from frac to dfrac
s/\b(auth|view)_(auth|both|update)_frac_(is_op|op_invN|op_inv|inv_L|validN|op_validN|valid|op_valid|valid_2|valid_discrete|includedN|included|alloc|validI|validI_2|validI_1|validI|)\b/\1_\2_dfrac_\3/g
s/\bgset_bij_auth_frac_(\w*)\b/gset_bij_auth_dfrac_\1/g
s/\bgset_bij_auth_empty_frac_valid\b/gset_bij_auth_empty_dfrac_valid/g
s/\bbij_both_frac_valid\b/bij_both_dfrac_valid/g
# big_sepM renames
s/\bbig_sepM2_lookup_1\b/big_sepM2_lookup_l/g
s/\bbig_sepM2_lookup_2\b/big_sepM2_lookup_r/g
# big_*_intro
s/\bbig_sep(L|L2|M|M2|S)_intuitionistically_forall\b/big_sep\1_intro/g
s/\bbig_orL_lookup\b/big_orL_intro/g
s/\bbupd_forall\b/bupd_plain_forall/g
# "global singleton" rename
s/\b(inv|iris|(gen|inv)_heap|(Gen|Inv)Heap|proph_map|ProphMap|[oO]wnP|[hH]eap)G\b/\1GS/g
s/\b([iI]nv|iris|(gen|inv)_heap|(Gen|Inv)Heap|proph_map|ProphMap|[oO]wnP|[hH]eap)PreG\b/\1GpreS/g
# iris.proofmode.tactics → iris.proofmode.proofmode
s/\bproofmode\.tactics\b/proofmode.proofmode/
s/(From +iris\.proofmode +Require +(Import|Export).*)\btactics\b/\1proofmode/
# iris_invG → iris_invGS
s/\biris_invG\b/iris_invGS/g
EOF
```
## Iris 3.4.0 (released 2021-02-16)
The highlights and most notable changes of this release are as follows:
* Coq 8.13 is now supported; the old Coq 8.9 and Coq 8.10 are not supported any
more.
* The new `view` RA construction generalizes `auth` to user-defined abstraction
relations. (thanks to Gregory Malecha for the inspiration)
* The new `dfrac` RA extends `frac` (fractions `0 < q ≤ 1`) with support for
"discarding" some part of the fraction in exchange for a persistent witness
that discarding has happened. This can be used to easily generalize fractional
permissions with support for persistently owning "any part" of the resource.
(by Simon Friis Vindum)
* The new `gmap_view` RA provides convenient lemmas for ghost ownership
of heap-like structures with an "authoritative" view. Thanks to `dfrac`, it
supports both exclusive (mutable) and persistent (immutable) ownership of
individual map elements.
* With this release we are beginning to provide logic-level abstractions for
ghost state, which have the advantage that the user does not have to directly
interact with RAs to use them.
- `ghost_var` provides a logic-level abstraction of ghost variables: a mutable
"variable" with fractional ownership.
- `mono_nat` provides a "monotone counter" with a persistent witnesses
representing a lower bound of the current counter value. (by Tej Chajed)
- `gset_bij` provides a monotonically growing partial bijection; this is
useful in particular when building binary logical relations for languages
with a heap.
* HeapLang provides a persistent read-only points-to assertion `l ↦□ v`.
(by Simon Friis Vindum)
* We split Iris into multiple opam packages: `coq-iris` no longer contains
HeapLang, which is now in a separate package `coq-iris-heap-lang`. The two
packages `coq-iris-deprecated` (for old modules that we eventually plan to
remove entirely) and `coq-iris-staging` (for new modules that are not yet
ready for prime time) exist only as development versions, so they are not part
of this release.
* The proofmode now does a better job at picking reasonable names when moving
variables into the Coq context without a name being explicitly given by the
user. However, the exact variable names remain unspecified. (by Tej Chajed)
Further details are given in the changelog below.
This release of Iris was managed by Ralf Jung and Robbert Krebbers, with
contributions by Arthur Azevedo de Amorim, Dan Frumin, Enrico Tassi, Hai Dang,
Michael Sammler, Paolo G. Giarrusso, Rodolphe Lepigre, Simon Friis Vindum, Tej
Chajed, and Yusuke Matsushita. Thanks a lot to everyone involved!
**Changes in `algebra`:** **Changes in `algebra`:**
* Rename `agree_op_inv'` to `to_agree_op_inv`,
`agree_op_invL'` to `to_agree_op_inv_L`, and add
`to_agree_op_invN`.
* Rename `auth_auth_frac_op_invL` to `auth_auth_frac_op_inv_L`,
`excl_auth_agreeL` to `excl_auth_agree_L`,
`frac_auth_agreeL` to `frac_auth_agree_L`, and
`ufrac_auth_agreeL` to `ufrac_auth_agree_L`.
* Add constructions to define a camera through restriction of the validity predicate * Add constructions to define a camera through restriction of the validity predicate
(`iso_cmra_mixin_restrict`) and through an isomorphism (`iso_cmra_mixin`). (`iso_cmra_mixin_restrict`) and through an isomorphism (`iso_cmra_mixin`).
* Add a `frac_agree` library which encapsulates `frac * agree A` for some OFE * Add a `frac_agree` library which encapsulates `frac * agree A` for some OFE
`A`, and provides some useful lemmas. `A`, and provides some useful lemmas.
* Add the view camera `view`, which generalizes the authoritative camera
`auth` by being parameterized by a relation that relates the authoritative
element with the fragments.
* Add the camera of discardable fractions `dfrac`. This is a generalization of
the normal fractional camera.
See [algebra.dfrac](iris/algebra/dfrac.v) for further information.
* Add `gmap_view`, a camera providing a "view of a `gmap`". The authoritative
element is any `gmap`; the fragment provides fractional ownership of a single
key, including support for persistent read-only ownership through `dfrac`.
See [algebra.lib.gmap_view](iris/algebra/lib/gmap_view.v) for further information.
* Add `mono_nat`, a wrapper for `auth max_nat`. The result is an authoritative
`nat` where a fragment is a lower bound whose ownership is persistent.
See [algebra.lib.mono_nat](iris/algebra/lib/mono_nat.v) for further information.
* Add the `gset_bij` resource algebra for monotone partial bijections.
See [algebra.lib.gset_bij](iris/algebra/lib/gset_bij.v) for further information.
* Rename `agree_op_inv'``to_agree_op_inv`,
`agree_op_invL'``to_agree_op_inv_L`, and add `to_agree_op_invN`.
* Rename `auth_auth_frac_op_invL``auth_auth_frac_op_inv_L`,
`excl_auth_agreeL``excl_auth_agree_L`,
`frac_auth_agreeL``frac_auth_agree_L`, and
`ufrac_auth_agreeL``ufrac_auth_agree_L`.
* Fix direction of `auth_auth_validN` to make it consistent with similar 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`. e.g., `auth_auth_valid`. The direction is now `✓{n} (● a) ↔ ✓{n} a`.
* Rename `auth_both_valid` to `auth_both_valid_discrete` and * Rename `auth_both_valid` to `auth_both_valid_discrete` and
`auth_both_frac_valid` to `auth_both_frac_valid_discrete`. The old name is `auth_both_frac_valid` to `auth_both_frac_valid_discrete`. The old name is
used for new, stronger lemmas that do not assume discreteness. used for new, stronger lemmas that do not assume discreteness.
* Add the view camera `view`, which generalizes the authoritative camera
`auth` 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 * 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 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 only way to construct elements of `auth` is via the elements `●{q} a` and
...@@ -40,39 +1153,72 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`. ...@@ -40,39 +1153,72 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`.
`auth_included`, `auth_valid_discrete`, and `auth_both_op`. For validity, use `auth_included`, `auth_valid_discrete`, and `auth_both_op`. For validity, use
`auth_auth_valid*`, `auth_frag_valid*`, or `auth_both_valid*` instead. `auth_auth_valid*`, `auth_frag_valid*`, or `auth_both_valid*` instead.
* Rename `auth_update_core_id` into `auth_update_frac_alloc`. * Rename `auth_update_core_id` into `auth_update_frac_alloc`.
* Add the camera of discardable fractions `dfrac`. This is a generalization of
the normal fractional camera.
See [algebra.dfrac](iris/algebra/dfrac.v) for further information.
* Rename `cmra_monotone_valid` into `cmra_morphism_valid` (this rename was * Rename `cmra_monotone_valid` into `cmra_morphism_valid` (this rename was
forgotten in !56). forgotten in !56).
* Add `gmap_view`, a camera providing a "view of a `gmap`". The authoritative
element is any `gmap`; the fragment provides fractional ownership of a single
key, including support for persistent read-only ownership through `dfrac`.
See [algebra.lib.gmap_view](iris/algebra/lib/gmap_view.v) for further information.
NOTE: The API surface for `gmap_view` is experimental and subject to change.
* Move the `*_validI` and `*_equivI` lemmas to a new module, `base_logic.algebra`. * Move the `*_validI` and `*_equivI` lemmas to a new module, `base_logic.algebra`.
That module is exported by `base_logic.base_logic` so it should usually be That module is exported by `base_logic.base_logic` so it should usually be
available everywhere without further changes. available everywhere without further changes.
* The authoritative fragment `✓ (◯ b : auth A)` is no longer definitionally * The authoritative fragment `✓ (◯ b : auth A)` is no longer definitionally
equal to `✓ b`. equal to `✓ b`.
* Add `mono_nat`, a wrapper for `auth max_nat`. The result is an authoritative
`nat` where a fragment is a lower bound whose ownership is persistent.
See [algebra.lib.mono_nat](iris/algebra/lib/mono_nat.v) for further information.
* Add the `gset_bij` resource algebra for monotone partial bijections.
See [algebra.lib.gset_bij](iris/algebra/lib/gset_bij.v) for further information.
* Change `*_valid` lemma statements involving fractions to use `Qp` addition and * Change `*_valid` lemma statements involving fractions to use `Qp` addition and
inequality instead of RA composition and validity (also in `base_logic` and inequality instead of RA composition and validity (also in `base_logic` and
the higher layers). the higher layers).
* Move `algebra.base` module to `prelude.prelude`. * Move `algebra.base` module to `prelude.prelude`.
* Strengthen `cmra_op_discrete` to assume only `✓{0} (x1 ⋅ x2)` instead of `✓
(x1 ⋅ x2)`.
* Rename the types `ofeT``ofe`, `cmraT``cmra`, `ucmraT``ucmra`, and the
constructors `OfeT``Ofe`, `CmraT``Cmra`, and `UcmraT``Ucmra` since the `T`
suffix is not needed. This change makes these names consistent with `bi`,
which also does not have a `T` suffix.
* Rename typeclass instances of CMRA operational typeclasses (`Op`, `Core`,
`PCore`, `Valid`, `ValidN`, `Unit`) to have a `_instance` suffix, so that
their original names are available to use as lemma names.
* Rename `frac_valid'``frac_valid`, `frac_op'``frac_op`,
`ufrac_op'``ufrac_op`, `coPset_op_union``coPset_op`, `coPset_core_self`
`coPset_core`, `gset_op_union``gset_op`, `gset_core_self``gset_core`,
`gmultiset_op_disj_union``gmultiset_op`, `gmultiset_core_empty`
`gmultiset_core`, `nat_op_plus``nat_op`, `max_nat_op_max`
`max_nat_op`. Those names were previously blocked by typeclass instances.
**Changes in `bi`:** **Changes in `bi`:**
* Add big op lemmas `big_op{L,L2,M,M2,S}_intuitionistically_forall` and * Add big op lemmas `big_op{L,L2,M,M2,S}_intuitionistically_forall` and
`big_sepL2_forall`, `big_sepMS_forall`, `big_sepMS_impl`, and `big_sepMS_dup`. `big_sepL2_forall`, `big_sepMS_forall`, `big_sepMS_impl`, and `big_sepMS_dup`.
* Add lemmas to big-ops that provide ownership of a single element and permit
changing the quantified-over predicate when re-assembling the big-op:
`big_sepL_lookup_acc_impl`, `big_sepL2_lookup_acc_impl`,
`big_sepM_lookup_acc_impl`, `big_sepM2_lookup_acc_impl`,
`big_sepS_elem_of_acc_impl`, `big_sepMS_elem_of_acc_impl`.
* Add lemmas `big_sepM_filter'` and `big_sepM_filter` matching the corresponding
`big_sepS` lemmas.
* Add lemmas for big-ops of magic wands: `big_sepL_wand`, `big_sepL2_wand`,
`big_sepM_wand`, `big_sepM2_wand`, `big_sepS_wand`, `big_sepMS_wand`.
* Add notation `¬ P` for `P → False` to `bi_scope`.
* Add `fupd_mask_intro` which can be conveniently `iApply`ed to goals of the
form `|={E1,E2}=>` to get rid of the `fupd` in the goal if `E2 ⊆ E1`. The
lemma `fupd_mask_weaken Enew` can be `iApply`ed to shrink the first mask to
`Enew` without getting rid of the modality; the same effect can also be
obtained slightly more conveniently by using `iMod` with `fupd_mask_subseteq
Enew`. To make the new names work, rename some existing lemmas:
`fupd_intro_mask``fupd_mask_intro_subseteq`,
`fupd_intro_mask'``fupd_mask_subseteq` (implicit arguments also changed
here), `fupd_mask_weaken``fupd_mask_intro_discard`. Remove `fupd_mask_same`
since it was unused and obscure. In the `BiFUpd` axiomatization, rename
`bi_fupd_mixin_fupd_intro_mask` to `bi_fupd_mixin_fupd_mask_subseteq` and
weaken the lemma to be specifically about `emp` (the stronger version can be
derived).
* Remove `bi.tactics` with tactics that predate the proofmode (and that have not * Remove `bi.tactics` with tactics that predate the proofmode (and that have not
been working properly for quite some time). been working properly for quite some time).
* Strengthen `persistent_sep_dup` to support propositions that are persistent * Strengthen `persistent_sep_dup` to support propositions that are persistent
and either affine or absorbing. and either affine or absorbing.
* Fix the statement of the lemma `fupd_plainly_laterN`; the old lemma was a
duplicate of `fupd_plain_laterN`.
* Strengthen `big_sepL2_app_inv` by weakening a premise (it is sufficient for
one of the two pairs of lists to have equal length).
* Rename `equiv_entails``equiv_entails_1_1`,
`equiv_entails_sym``equiv_entails_1_2`, and `equiv_spec``equiv_entails`.
* Remove the laws `pure_forall_2 : (∀ a, ⌜ φ a ⌝) ⊢ ⌜ ∀ a, φ a ⌝` from the BI
interface and factor it into a type class `BiPureForall`.
**Changes in `proofmode`:** **Changes in `proofmode`:**
...@@ -96,14 +1242,45 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`. ...@@ -96,14 +1242,45 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`.
* Allow framing below an `<affine>` modality if the hypothesis that is framed is * Allow framing below an `<affine>` modality if the hypothesis that is framed is
affine. (Previously, framing below `<affine>` was only possible if the affine. (Previously, framing below `<affine>` was only possible if the
hypothesis that is framed resides in the intuitionistic context.) hypothesis that is framed resides in the intuitionistic context.)
* Remove the laws `pure_forall_2 : (∀ a, ⌜ φ a ⌝) ⊢ ⌜ ∀ a, φ a ⌝` from the BI * Add Coq side-condition `φ` to class `ElimAcc` (similar to what we already had
interface and factor it into a type class `BiPureForall`. for `ElimInv` and `ElimModal`).
* Add notation `¬ P` for `P → False` to `bi_scope`. * Add a tactic `iSelect pat tac` (similar to `select` in std++) which runs the
tactic `tac H` with the name `H` of the last hypothesis of the intuitionistic
or spatial context matching `pat`. The tactic `iSelect` is used to implement:
+ `iRename select (pat)%I into name` which renames the matching hypothesis,
+ `iDestruct select (pat)%I as ...` which destructs the matching hypothesis,
+ `iClear select (pat)%I` which clears the matching hypothesis,
+ `iRevert select (pat)%I` which reverts the matching hypothesis,
+ `iFrame select (pat)%I` which cancels the matching hypothesis.
**Changes in `base_logic`:** **Changes in `base_logic`:**
* Add a `ghost_var` library that provides (fractional) ownership of a ghost * Add a `ghost_var` library that provides (fractional) ownership of a ghost
variable of arbitrary `Type`. variable of arbitrary `Type`.
* Define a ghost state library on top of the `mono_nat` resource algebra.
See [base_logic.lib.mono_nat](iris/base_logic/lib/mono_nat.v) for further
information.
* Define a ghost state library on top of the `gset_bij` resource algebra.
See [base_logic.lib.gset_bij](iris/base_logic/lib/gset_bij.v) for further
information.
* Extend the `gen_heap` library with read-only points-to assertions using
[discardable fractions](iris/algebra/dfrac.v).
+ The `mapsto` connective now takes a `dfrac` rather than a `frac` (i.e.,
positive rational number `Qp`).
+ The notation `l ↦{ dq } v` is generalized to discardable fractions
`dq : dfrac`.
+ The new notation `l ↦{# q} v` is used for a concrete fraction `q : frac`
(e.g., to enable writing `l ↦{# 1/2} v`).
+ The new notation `l ↦□ v` is used for the discarded fraction. This
persistent proposition provides read-only access to `l`.
+ The lemma `mapsto_persist : l ↦{dq} v ==∗ l ↦□ v` is used for making the
location `l` read-only.
+ See the [changes to HeapLang](https://gitlab.mpi-sws.org/iris/iris/-/merge_requests/554)
for an indication on how to adapt your language.
+ See the [changes to iris-examples](https://gitlab.mpi-sws.org/iris/examples/-/commit/a8425b708ec51d918d5cf6eb3ab6fde88f4e2c2a)
for an indication on how to adapt your development. In particular, instead
of `∃ q, l ↦{q} v` you likely want to use `l ↦□ v`, which has the advantage
of being persistent (rather than just duplicable).
* Change type of some ghost state lemmas (mostly about allocation) to use `∗` * Change type of some ghost state lemmas (mostly about allocation) to use `∗`
instead of `∧` (consistent with our usual style). This affects the following instead of `∧` (consistent with our usual style). This affects the following
lemmas: `own_alloc_strong_dep`, `own_alloc_cofinite_dep`, `own_alloc_strong`, lemmas: `own_alloc_strong_dep`, `own_alloc_cofinite_dep`, `own_alloc_strong`,
...@@ -127,12 +1304,6 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`. ...@@ -127,12 +1304,6 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`.
`uPred.discrete_fun_validI` to the new `base_logic.algebra` module. That `uPred.discrete_fun_validI` to the new `base_logic.algebra` module. That
module is exported by `base_logic.base_logic` so these names are now usually module is exported by `base_logic.base_logic` so these names are now usually
available everywhere, and no longer inside the `uPred` module. available everywhere, and no longer inside the `uPred` module.
* Define a ghost state library on top of the `mono_nat` resource algebra.
See [base_logic.lib.mono_nat](iris/base_logic/lib/mono_nat.v) for further
information.
* Define a ghost state library on top of the `gset_bij` resource algebra.
See [base_logic.lib.gset_bij](iris/base_logic/lib/gset_bij.v) for further
information.
* Remove the `gen_heap` notations `l ↦ -` and `l ↦{q} -`. They were barely used * Remove the `gen_heap` notations `l ↦ -` and `l ↦{q} -`. They were barely used
and looked very confusing in context: `l ↦ - ∗ P` looks like a magic wand. and looked very confusing in context: `l ↦ - ∗ P` looks like a magic wand.
* Change `gen_inv_heap` notation `l ↦□ I` to `l ↦_I □`, so that `↦□` can be used * Change `gen_inv_heap` notation `l ↦□ I` to `l ↦_I □`, so that `↦□` can be used
...@@ -143,6 +1314,13 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`. ...@@ -143,6 +1314,13 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`.
initial heap. initial heap.
* Rename `mapsto_mapsto_ne` to `mapsto_frac_ne`, and add a simpler * Rename `mapsto_mapsto_ne` to `mapsto_frac_ne`, and add a simpler
`mapsto_ne` that does not require reasoning about fractions. `mapsto_ne` that does not require reasoning about fractions.
* Deprecate the `auth` and `sts` modules. These were logic-level wrappers around
the underlying RAs; as far as we know, they are unused since they were not
flexible enough for practical use.
* Deprecate the `viewshift` module, which defined a binary view-shift connective
with an implicit persistence modality. It was unused and too easily confused
with `={_}=∗`, the binary view-shift (fancy update) *without* a persistence
modality.
**Changes in `program_logic`:** **Changes in `program_logic`:**
...@@ -152,7 +1330,18 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`. ...@@ -152,7 +1330,18 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`.
* `pure_exec_fill` is no longer registered as an instance for `PureExec`, to * `pure_exec_fill` is no longer registered as an instance for `PureExec`, to
avoid TC search attempting to apply this instance all the time. avoid TC search attempting to apply this instance all the time.
* Merge `wp_value_inv`/`wp_value_inv'` into `wp_value_fupd`/`wp_value_fupd'` by * Merge `wp_value_inv`/`wp_value_inv'` into `wp_value_fupd`/`wp_value_fupd'` by
making the lemma bidirectional. making the lemmas bidirectional.
* Generalize HeapLang's `mapsto` (`↦`), `array` (`↦∗`), and atomic heap
connectives to discardable fractions. See the CHANGELOG entry in the category
`base_logic` for more information.
* Opening an invariant or eliminating a mask-changing update modality around a
non-atomic weakest precondition creates a side-condition `Atomic ...`.
Before, this would fail with the unspecific error "iMod: cannot eliminate
modality (|={E1,E2}=> ...) in (WP ...)".
* In `Ectx_step` and `step_atomic`, mark the parameters that are determined by
the goal as implicit.
* Deprecate the `hoare` module to prevent accidental usage; the recommended way
to write Hoare-style specifications is to use Texan triples.
**Changes in `heap_lang`:** **Changes in `heap_lang`:**
...@@ -161,6 +1350,13 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`. ...@@ -161,6 +1350,13 @@ HeapLang, which is now in a separate package `coq-iris-heap-lang`.
already at the top level). already at the top level).
* The `wp_` tactics now preserve the possibility of doing a fancy update when * The `wp_` tactics now preserve the possibility of doing a fancy update when
the expression reduces to a value. the expression reduces to a value.
* Move `IntoVal`, `AsVal`, `Atomic`, `AsRecV`, and `PureExec` instances to their
own file [heap_lang.class_instances](iris_heap_lang/class_instances.v).
* Move `inv_head_step` tactic and `head_step` auto hints (now part of new hint
database `head_step`) to [heap_lang.tactics](iris_heap_lang/tactics.v).
* The tactic `wp_apply` no longer performs `wp_pures` before applying the given
lemma. The new tactic `wp_smart_apply` repeatedly performs single `wp_pure`
steps until the lemma matches the goal.
The following `sed` script helps adjust your code to the renaming (on macOS, 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`). replace `sed` by `gsed`, installed via e.g. `brew install gnu-sed`).
...@@ -180,6 +1376,25 @@ s/\bgen_heap_ctx\b/gen_heap_interp/g ...@@ -180,6 +1376,25 @@ s/\bgen_heap_ctx\b/gen_heap_interp/g
s/\bproph_map_ctx\b/proph_map_interp/g s/\bproph_map_ctx\b/proph_map_interp/g
# other gen_heap changes # other gen_heap changes
s/\bmapsto_mapsto_ne\b/mapsto_frac_ne/g s/\bmapsto_mapsto_ne\b/mapsto_frac_ne/g
# remove Ts in algebra
s/\bofeT\b/ofe/g
s/\bOfeT\b/Ofe/g
s/\bcmraT\b/cmra/g
s/\bCmraT\b/Cmra/g
s/\bucmraT\b/ucmra/g
s/\bUcmraT\b/Ucmra/g
# _op/valid/core lemmas
s/\b(u?frac_(op|valid))'/\1/g
s/\b((coPset|gset)_op)_union\b/\1/g
s/\b((coPset|gset)_core)_self\b/\1/g
s/\b(gmultiset_op)_disj_union\b/\1/g
s/\b(gmultiset_core)_empty\b/\1/g
s/\b(nat_op)_plus\b/\1/g
s/\b(max_nat_op)_max\b/\1/g
# equiv_spec
s/\bequiv_entails\b/equiv_entails_1_1/g
s/\bequiv_entails_sym\b/equiv_entails_1_2/g
s/\bequiv_spec\b/equiv_entails/g
EOF EOF
``` ```
......
...@@ -36,6 +36,15 @@ a feature branch instead. ...@@ -36,6 +36,15 @@ a feature branch instead.
[jung]: https://gitlab.mpi-sws.org/jung [jung]: https://gitlab.mpi-sws.org/jung
[iris]: https://gitlab.mpi-sws.org/iris/iris [iris]: https://gitlab.mpi-sws.org/iris/iris
We prefer small and self-contained merge requests that add a single feature
over merge requests that add arbitrary collections of lemmas. Small merge
requests are easier to review, and will typically be merged more quickly
(because it avoids blocking the whole merge request on a single
discussion).
Please follow the coding style laid out in our [style
guide](docs/style_guide.md).
## How to update the std++ dependency ## How to update the std++ dependency
* Do the change in std++, push it. * Do the change in std++, push it.
...@@ -78,50 +87,46 @@ same by pinning `coq-iris` to your Iris checkout.) ...@@ -78,50 +87,46 @@ same by pinning `coq-iris` to your Iris checkout.)
Note that `./make-package` will never run the test suite, so please always do a Note that `./make-package` will never run the test suite, so please always do a
regular `make -jN` before submitting an MR. regular `make -jN` before submitting an MR.
## How to measure the timing effect on a reverse dependency ## How to test effects on reverse dependencies
So say you did a change in Iris, and want to know how it affects [lambda-rust] The `iris-bot` script makes it easy to test the effect of a branch on reverse
or the [examples]. To do this, check out the respective project and change its dependencies. It can start tests ensuring they all still build, and it can do
`.gitlab-ci.yml` to contain only one build job, which should look like comparative timing runs.
If you have suitable permissions, you can trigger these builds yourself.
But first, you need to do some setup: you need to create a GitLab access token
and set the `GITLAB_TOKEN` environment variable to it. Go to
<https://gitlab.mpi-sws.org/-/profile/personal_access_tokens>, pick a suitable
name (such as "iris-bot"), select the "api" scope, and then click "Create
personal access token". Copy the value it shows and store it in some suitable
place; you will not be able to retrieve this value from GitLab in the future!
For example, you could create a `.env` file in your Iris clone containing:
``` ```
build-iris.dev: export GITLAB_TOKEN=<your token here>
<<: *template
variables:
OPAM_PINS: "coq version 8.12.0 coq-iris.dev git git+https://gitlab.mpi-sws.org/iris/iris.git#yourname/feature coq-iris-heap-lang.dev git git+https://gitlab.mpi-sws.org/iris/iris.git#yourname/feature"
tags:
- fp-timing
``` ```
You will have to adjust this a bit: you should use the same Coq version as Then you can easily get the token back into the environment via `. .env`.
whatever the master branch uses for its timing job, which you can determine by
checking its `.gitlab-ci.yml`. You will also have to adjust the Iris branch Once that setup is done, you can now use `iris-bot`. Set at least one of
being used, which is determined after the `#` in `OPAM_PINS`. If the repo you `IRIS_REV` or `STDPP_REV` to control which branches of these projects to build
are testing does not need HeapLang, you can remove the `coq-iris-heap-lang` part against (they default to the default git branch). `IRIS_REPO` and `STDPP_REPO`
of `OPAM_PINS`. If you are in doubt, ask on Mattermost *before* pushing your can be used to control the repository in which the branch is situated. Setting
branch. Please double-check that the job name is `build-iris.dev` to avoid `IRIS` to "user:branch" will use the given branch on that user's fork of Iris,
polluting the caches of regular CI builds! This way, you are going to share the and similar for `STDPP`.
cache with the nightly builds, which is fine.
Supported commands:
Once you are confident with your CI configuration, push this to a new branch - `./iris-bot build [$filter]`: Builds all reverse dependencies against the
whose name starts with `ci/`. It should usually be of the form given branches. The optional `filter` argument only builds projects whose
`ci/yourname/feature`. You should see a pipeline running in GitLab with just a names contains that string.
single job, and you can follow its progress there. - `./iris-bot time $project`: Measure the impact of this branch on the build
time of the given reverse dependency. Only Iris branches are supported for
When the job is done, you should be able to see it as a single dot on our now.
[statistics server][coq-speed] after selecting the right project and branch.
Click on "Coq-Speed" on the top-left corner to switch to another dashboard, and Examples:
select "Coq-Compare". Now you can select the project and the two measurements - `IRIS_REV=myname/mybranch ./iris-bot build` builds *all* reverse dependencies
you want to compare, which would be the SHA of the commit you just created as against `myname/mybranch` from the main Iris repository.
"Commit 2", and the SHA of its parent as "Commit 1". Don't forget to also - `IRIS=user:branch ./iris-bot build examples` builds the [examples] against
select the right configuration for both of them. The "Grouping" is a regular the `branch` in `user`'s fork of Iris.
expression that you can use to switch between per-file, per-directory and - `IRIS_REV=myname/mybranch ./iris-bot time examples` measures the timing impact
per-project grouping of the measurements. of `myname/mybranch` from the main Iris repository on the [examples].
If you changed your Iris branch and want to make another measurement, *do not*
just "Retry" the CI job. That will lead to an error, because you would end up
with two measurements for the same commit. Instead, create an empty commit in
your branch of the to-be-measured project (`git commit --allow-empty -m
"rerun"`), and push that.
[lambda-rust]: https://gitlab.mpi-sws.org/iris/lambda-rust
[examples]: https://gitlab.mpi-sws.org/iris/examples [examples]: https://gitlab.mpi-sws.org/iris/examples
[coq-speed]: https://coq-speed.mpi-sws.org
...@@ -3,6 +3,12 @@ all: Makefile.coq ...@@ -3,6 +3,12 @@ all: Makefile.coq
+@$(MAKE) -f Makefile.coq all +@$(MAKE) -f Makefile.coq all
.PHONY: all .PHONY: all
# Build with dune.
# This exists only for CI; you should just call `dune build` directly instead.
dune:
@dune build --display=short
.PHONY: dune
# Permit local customization # Permit local customization
-include Makefile.local -include Makefile.local
......
...@@ -4,23 +4,33 @@ NO_TEST:= ...@@ -4,23 +4,33 @@ NO_TEST:=
# use MAKE_REF=1 to generate new reference files # use MAKE_REF=1 to generate new reference files
MAKE_REF:= MAKE_REF:=
# Only test reference output on known versions of Coq, to avoid blocking
# Coq CI when they change the printing a little.
# Need to make this a lazy variable (`=` instead of `:=`) since COQ_VERSION is only set later.
COQ_REF=$(shell echo "$(COQ_VERSION)" | grep -E "^8\.(20)\." -q && echo 1)
# Run tests interleaved with main build. They have to be in the same target for this. # Run tests interleaved with main build. They have to be in the same target for this.
real-all: $(if $(NO_TEST),,test) real-all: style $(if $(NO_TEST),,test)
style: $(VFILES) coq-lint.sh
# Make sure everything imports the options, and some general linting.
$(SHOW)"COQLINT"
$(HIDE)for FILE in $(VFILES); do \
if ! grep -F -q 'From iris.prelude Require Import options.' "$$FILE"; then echo "ERROR: $$FILE does not import 'options'."; echo; exit 1; fi ; \
./coq-lint.sh "$$FILE" || exit 1; \
done
# Make sure main Iris does not import other Iris packages.
$(HIDE)if grep -E 'iris\.(heap_lang|deprecated|unstable)' --include "*.v" -R iris; then echo "ERROR: Iris may not import modules from other Iris packages (see above for violations)."; echo; exit 1; fi
.PHONY: style
# the test suite # the test suite
TESTFILES:=$(shell find tests -name "*.v") TESTFILES:=$(shell find tests -name "*.v")
NORMALIZER:=test-normalizer.sed NORMALIZER:=test-normalizer.sed
test: $(TESTFILES:.v=.vo) test: $(TESTFILES:.v=.vo)
# Make sure everything imports the options.
$(HIDE)for FILE in $(VFILES); do \
if ! fgrep -q 'From iris.prelude Require Import options.' "$$FILE"; then echo "ERROR: $$FILE does not import 'options'."; echo; exit 1; fi \
done
.PHONY: test .PHONY: test
COQ_TEST=$(COQTOP) $(COQDEBUG) -batch -test-mode COQ_TEST=$(COQTOP) $(COQDEBUG) -batch -test-mode
# Need to make this a lazy variable (`=` instead of `:=`) since COQ_VERSION is only set later.
COQ_MINOR_VERSION=$(shell echo "$(COQ_VERSION)" | egrep '^[0-9]+\.[0-9]+\b' -o)
tests/.coqdeps.d: $(TESTFILES) tests/.coqdeps.d: $(TESTFILES)
$(SHOW)'COQDEP TESTFILES' $(SHOW)'COQDEP TESTFILES'
...@@ -30,21 +40,22 @@ tests/.coqdeps.d: $(TESTFILES) ...@@ -30,21 +40,22 @@ tests/.coqdeps.d: $(TESTFILES)
# Main test script (comments out-of-line because macOS otherwise barfs?!?) # Main test script (comments out-of-line because macOS otherwise barfs?!?)
# - Determine reference file (`REF`). # - Determine reference file (`REF`).
# - Print user-visible status line. # - Print user-visible status line.
# - unset env vars that change Coq's output
# - Dump Coq output into a temporary file. # - Dump Coq output into a temporary file.
# - Run `sed -i` on that file in a way that works on macOS. # - Run `sed -i` on that file in a way that works on macOS.
# - Either compare the result with the reference file, or move it over the reference file. # - Either compare the result with the reference file, or move it over the reference file.
# - Cleanup, and mark as done for make. # - Cleanup, and mark as done for make.
$(TESTFILES:.v=.vo): %.vo: %.v $(if $(MAKE_REF),,%.ref) $(NORMALIZER) $(TESTFILES:.v=.vo): %.vo: %.v $(if $(MAKE_REF),,%.ref) $(NORMALIZER)
$(HIDE)if test -f $*".$(COQ_MINOR_VERSION).ref"; then \ $(HIDE)REF=$*".ref" && \
REF=$*".$(COQ_MINOR_VERSION).ref"; \ echo "COQTEST$(if $(COQ_REF),$(if $(MAKE_REF), [make ref],), [ref ignored]) $< (ref: $$REF)" && \
else \
REF=$*".ref"; \
fi && \
echo "COQTEST$(if $(MAKE_REF), [make ref],) $< (ref: $$REF)" && \
TMPFILE="$$(mktemp)" && \ TMPFILE="$$(mktemp)" && \
unset OCAMLRUNPARAM && \
$(TIMER) $(COQ_TEST) $(COQFLAGS) $(COQLIBS) -load-vernac-source $< > "$$TMPFILE" && \ $(TIMER) $(COQ_TEST) $(COQFLAGS) $(COQLIBS) -load-vernac-source $< > "$$TMPFILE" && \
sed -f $(NORMALIZER) "$$TMPFILE" > "$$TMPFILE".new && \ sed -E -f $(NORMALIZER) "$$TMPFILE" > "$$TMPFILE".new && \
mv "$$TMPFILE".new "$$TMPFILE" && \ mv "$$TMPFILE".new "$$TMPFILE" && \
$(if $(MAKE_REF),mv "$$TMPFILE" "$$REF",diff -u "$$REF" "$$TMPFILE") && \ $(if $(COQ_REF),\
$(if $(MAKE_REF),mv "$$TMPFILE" "$$REF",diff --strip-trailing-cr -u "$$REF" "$$TMPFILE"), \
true \
) && \
rm -f "$$TMPFILE" && \ rm -f "$$TMPFILE" && \
touch $@ touch $@
This file has [moved](docs/proof_mode.md).
# IRIS COQ DEVELOPMENT [[coqdoc]](https://plv.mpi-sws.org/coqdoc/iris/) # Iris Coq Development [[coqdoc]](https://plv.mpi-sws.org/coqdoc/iris/)
This is the Coq development of the [Iris Project](http://iris-project.org), This is the Coq development of the [Iris Project](http://iris-project.org),
which includes [MoSeL](http://iris-project.org/mosel/), a general proof mode which includes [MoSeL](http://iris-project.org/mosel/), a general proof mode
...@@ -10,7 +10,7 @@ For using the Coq library, check out the ...@@ -10,7 +10,7 @@ For using the Coq library, check out the
For understanding the theory of Iris, a LaTeX version of the core logic For understanding the theory of Iris, a LaTeX version of the core logic
definitions and some derived forms is available in definitions and some derived forms is available in
[tex/iris.tex](tex/iris.tex). A compiled PDF version of this document is [tex/iris.tex](tex/iris.tex). A compiled PDF version of this document is
[available online](http://plv.mpi-sws.org/iris/appendix-3.2.pdf). [available online](http://plv.mpi-sws.org/iris/appendix-3.4.pdf).
## Side-effects ## Side-effects
...@@ -30,13 +30,15 @@ Importing Iris has some side effects as the library sets some global options. ...@@ -30,13 +30,15 @@ Importing Iris has some side effects as the library sets some global options.
This version is known to compile with: This version is known to compile with:
- Coq 8.11.2 / 8.12.1 - Coq 8.19.2 / 8.20.1
- A development version of [std++](https://gitlab.mpi-sws.org/iris/stdpp) - A development version of [std++](https://gitlab.mpi-sws.org/iris/stdpp)
If you need to work with Coq 8.7 or Coq 8.8, please check out the Generally we always aim to support the last two stable Coq releases. Support for
[iris-3.2 branch](https://gitlab.mpi-sws.org/iris/iris/tree/iris-3.2). older versions will be dropped when it is convenient.
For Coq 8.9, you can use the
[iris-3.3 branch](https://gitlab.mpi-sws.org/iris/iris/tree/iris-3.3). If you need to work with older versions of Coq, you can check out the
[tags](https://gitlab.mpi-sws.org/iris/iris/-/tags) for old Iris releases that
still support them.
### Working *with* Iris ### Working *with* Iris
...@@ -65,7 +67,8 @@ We do not guarantee backwards-compatibility, so upgrading Iris may break your ...@@ -65,7 +67,8 @@ We do not guarantee backwards-compatibility, so upgrading Iris may break your
Iris-using developments. If you want to be notified of breaking changes, please Iris-using developments. If you want to be notified of breaking changes, please
let us know your account name on the let us know your account name on the
[MPI-SWS GitLab](https://gitlab.mpi-sws.org/) so we can add you to the [MPI-SWS GitLab](https://gitlab.mpi-sws.org/) so we can add you to the
notification group. notification group. Note that this excludes the "unstable" and "deprecated"
packages (see below).
#### Use of Iris in submitted artifacts #### Use of Iris in submitted artifacts
...@@ -85,39 +88,60 @@ the Iris development itself. ...@@ -85,39 +88,60 @@ the Iris development itself.
## Directory Structure ## Directory Structure
* The folder [prelude](iris/prelude) contains modules imported everywhere in Iris is structured into multiple *packages*, some of which contain multiple
Iris. modules in separate folders.
* The folder [algebra](iris/algebra) contains the COFE and CMRA
constructions as well as the solver for recursive domain equations. * The [iris](iris) package contains the language-independent parts of Iris.
* The folder [base_logic](iris/base_logic) defines the Iris base logic and + The folder [prelude](iris/prelude) contains modules imported everywhere in
the primitive connectives. It also contains derived constructions that are Iris.
entirely independent of the choice of resources. + The folder [algebra](iris/algebra) contains the COFE and CMRA
* The subfolder [lib](iris/base_logic/lib) contains some generally useful constructions as well as the solver for recursive domain equations.
derived constructions. Most importantly, it defines composable - The subfolder [lib](iris/algebra/lib) contains some general derived RA
dynamic resources and ownership of them; the other constructions depend constructions.
on this setup. + The folder [bi](iris/bi) contains the BI++ laws, as well as derived
* The folder [program_logic](iris/program_logic) specializes the base logic connectives, laws and constructions that are applicable for general BIs.
to build Iris, the program logic. This includes weakest preconditions that - The subfolder [lib](iris/bi/lib) contains some general derived logical
are defined for any language satisfying some generic axioms, and some derived constructions.
constructions that work for any such language. + The folder [proofmode](iris/proofmode) contains
* The folder [bi](iris/bi) contains the BI++ laws, as well as derived [MoSeL](http://iris-project.org/mosel/), which extends Coq with contexts for
connectives, laws and constructions that are applicable for general BIS. intuitionistic and spatial BI++ assertions. It also contains tactics for
* The folder [proofmode](iris/proofmode) contains interactive proofs. Documentation can be found in
[MoSeL](http://iris-project.org/mosel/), which extends Coq with contexts for [proof_mode.md](docs/proof_mode.md).
intuitionistic and spatial BI++ assertions. It also contains tactics for + The folder [base_logic](iris/base_logic) defines the Iris base logic and
interactive proofs. Documentation can be found in the primitive connectives. It also contains derived constructions that are
[proof_mode.md](docs/proof_mode.md). entirely independent of the choice of resources.
* The folder [heap_lang](iris_heap_lang) defines the ML-like concurrent heap - The subfolder [lib](iris/base_logic/lib) contains some generally useful
language derived constructions. Most importantly, it defines composable
* The subfolder [lib](iris_heap_lang/lib) contains a few derived dynamic resources and ownership of them; the other constructions depend
on this setup.
+ The folder [program_logic](iris/program_logic) specializes the base logic
to build Iris, the program logic. This includes weakest preconditions that
are defined for any language satisfying some generic axioms, and some derived
constructions that work for any such language.
+ The folder [si_logic](iris/si_logic) defines a "plain" step-indexed logic
and shows that it is an instance of the BI interface.
* The [iris_heap_lang](iris_heap_lang) package defines the ML-like concurrent
language HeapLang and provides tactic support and proof mode integration.
+ The subfolder [lib](iris_heap_lang/lib) contains a few derived
constructions within this language, e.g., parallel composition. constructions within this language, e.g., parallel composition.
For more examples of using Iris and heap_lang, have a look at the For more examples of using Iris and heap_lang, have a look at the
[Iris Examples](https://gitlab.mpi-sws.org/iris/examples). [Iris Examples](https://gitlab.mpi-sws.org/iris/examples).
* The [iris_unstable](iris_unstable) package contains libraries that are not yet
ready for inclusion in Iris proper. For each library, there is a corresponding
"tracking issue" in the Iris issue tracker (also linked from the library
itself) which tracks the work that still needs to be done before moving the
library to Iris. No stability guarantees whatsoever are made for this package.
* The [iris_deprecated](iris_deprecated) package contains libraries that have been
removed from Iris proper, but are kept around to give users some more time to
switch to their intended replacements. The individual libraries come with comments
explaining the deprecation and making recommendations for what to use
instead. No stability guarantees whatsoever are made for this package.
* The folder [tests](tests) contains modules we use to test our * The folder [tests](tests) contains modules we use to test our
infrastructure. Users of the Iris Coq library should *not* depend on these infrastructure. These modules are not installed by `make install`, and should
modules; they may change or disappear without any notice. not be imported.
* The folder [si_logic](iris/si_logic) defines a "plain" step-indexed logic
and shows that it is an instance of the BI interface. Note that the unstable and deprecated packages are not released, so they only
exist in the development version of Iris.
## Case Studies ## Case Studies
...@@ -141,6 +165,7 @@ that should be compatible with this version: ...@@ -141,6 +165,7 @@ that should be compatible with this version:
Getting along with Iris in Coq: Getting along with Iris in Coq:
* The coding style is documented in the [style guide](docs/style_guide.md).
* Iris proof patterns and conventions are documented in the * Iris proof patterns and conventions are documented in the
[proof guide](docs/proof_guide.md). [proof guide](docs/proof_guide.md).
* Various notions of equality and logical entailment in Iris and their Coq * Various notions of equality and logical entailment in Iris and their Coq
...@@ -153,10 +178,9 @@ Getting along with Iris in Coq: ...@@ -153,10 +178,9 @@ Getting along with Iris in Coq:
Contacting the developers: Contacting the developers:
* Discussion about the Iris Coq development happens on the mailing list * Discussion about the Iris Coq development happens in the [Iris
[iris-club@lists.mpi-sws.org](https://lists.mpi-sws.org/listinfo/iris-club) Chat](https://iris-project.org/chat.html). This is also the right place to ask
and in the [Iris Chat](https://iris-project.org/chat.html). This is also the questions.
right place to ask questions.
* If you want to report a bug, please use the * If you want to report a bug, please use the
[issue tracker](https://gitlab.mpi-sws.org/iris/iris/issues), which requires [issue tracker](https://gitlab.mpi-sws.org/iris/iris/issues), which requires
an MPI-SWS GitLab account. The [chat page](https://iris-project.org/chat.html) an MPI-SWS GitLab account. The [chat page](https://iris-project.org/chat.html)
......
...@@ -8,13 +8,20 @@ ...@@ -8,13 +8,20 @@
-Q iris/base_logic iris.base_logic -Q iris/base_logic iris.base_logic
-Q iris/program_logic iris.program_logic -Q iris/program_logic iris.program_logic
-Q iris_heap_lang iris.heap_lang -Q iris_heap_lang iris.heap_lang
-Q iris_unstable iris.unstable
-Q iris_deprecated iris.deprecated
# Custom flags (to be kept in sync with the dune file at the root of the repo).
# We sometimes want to locally override notation, and there is no good way to do that with scopes. # We sometimes want to locally override notation, and there is no good way to do that with scopes.
-arg -w -arg -notation-overridden -arg -w -arg -notation-overridden
# Coq emits warnings when a custom entry is reimported, this is too noisy.
-arg -w -arg -custom-entry-overriden
# Cannot use non-canonical projections as it causes massive unification failures # Cannot use non-canonical projections as it causes massive unification failures
# (https://github.com/coq/coq/issues/6294). # (https://github.com/coq/coq/issues/6294).
-arg -w -arg -redundant-canonical-projection -arg -w -arg -redundant-canonical-projection
# Warning seems incorrect, see https://gitlab.mpi-sws.org/iris/stdpp/-/issues/216
-arg -w -arg -notation-incompatible-prefix
# We can't do this migration yet until we require Coq 9.0
-arg -w -arg -deprecated-from-Coq
-arg -w -arg -deprecated-dirpath-Coq
iris/prelude/options.v iris/prelude/options.v
iris/prelude/prelude.v iris/prelude/prelude.v
...@@ -28,7 +35,6 @@ iris/algebra/view.v ...@@ -28,7 +35,6 @@ iris/algebra/view.v
iris/algebra/auth.v iris/algebra/auth.v
iris/algebra/gmap.v iris/algebra/gmap.v
iris/algebra/ofe.v iris/algebra/ofe.v
iris/algebra/dra.v
iris/algebra/cofe_solver.v iris/algebra/cofe_solver.v
iris/algebra/agree.v iris/algebra/agree.v
iris/algebra/excl.v iris/algebra/excl.v
...@@ -45,19 +51,25 @@ iris/algebra/gmultiset.v ...@@ -45,19 +51,25 @@ iris/algebra/gmultiset.v
iris/algebra/coPset.v iris/algebra/coPset.v
iris/algebra/proofmode_classes.v iris/algebra/proofmode_classes.v
iris/algebra/ufrac.v iris/algebra/ufrac.v
iris/algebra/namespace_map.v iris/algebra/reservation_map.v
iris/algebra/dyn_reservation_map.v
iris/algebra/max_prefix_list.v
iris/algebra/mra.v
iris/algebra/lib/excl_auth.v iris/algebra/lib/excl_auth.v
iris/algebra/lib/frac_auth.v iris/algebra/lib/frac_auth.v
iris/algebra/lib/ufrac_auth.v iris/algebra/lib/ufrac_auth.v
iris/algebra/lib/frac_agree.v iris/algebra/lib/dfrac_agree.v
iris/algebra/lib/gmap_view.v iris/algebra/lib/gmap_view.v
iris/algebra/lib/mono_nat.v iris/algebra/lib/mono_nat.v
iris/algebra/lib/mono_Z.v
iris/algebra/lib/mono_list.v
iris/algebra/lib/gset_bij.v iris/algebra/lib/gset_bij.v
iris/si_logic/siprop.v iris/si_logic/siprop.v
iris/si_logic/bi.v iris/si_logic/bi.v
iris/bi/notation.v iris/bi/notation.v
iris/bi/interface.v iris/bi/interface.v
iris/bi/derived_connectives.v iris/bi/derived_connectives.v
iris/bi/extensions.v
iris/bi/derived_laws.v iris/bi/derived_laws.v
iris/bi/derived_laws_later.v iris/bi/derived_laws_later.v
iris/bi/plainly.v iris/bi/plainly.v
...@@ -70,8 +82,10 @@ iris/bi/monpred.v ...@@ -70,8 +82,10 @@ iris/bi/monpred.v
iris/bi/embedding.v iris/bi/embedding.v
iris/bi/weakestpre.v iris/bi/weakestpre.v
iris/bi/telescopes.v iris/bi/telescopes.v
iris/bi/lib/cmra.v
iris/bi/lib/counterexamples.v iris/bi/lib/counterexamples.v
iris/bi/lib/fixpoint.v iris/bi/lib/fixpoint_mono.v
iris/bi/lib/fixpoint_banach.v
iris/bi/lib/fractional.v iris/bi/lib/fractional.v
iris/bi/lib/laterable.v iris/bi/lib/laterable.v
iris/bi/lib/atomic.v iris/bi/lib/atomic.v
...@@ -90,9 +104,6 @@ iris/base_logic/lib/saved_prop.v ...@@ -90,9 +104,6 @@ iris/base_logic/lib/saved_prop.v
iris/base_logic/lib/wsat.v iris/base_logic/lib/wsat.v
iris/base_logic/lib/invariants.v iris/base_logic/lib/invariants.v
iris/base_logic/lib/fancy_updates.v iris/base_logic/lib/fancy_updates.v
iris/base_logic/lib/viewshifts.v
iris/base_logic/lib/auth.v
iris/base_logic/lib/sts.v
iris/base_logic/lib/boxes.v iris/base_logic/lib/boxes.v
iris/base_logic/lib/na_invariants.v iris/base_logic/lib/na_invariants.v
iris/base_logic/lib/cancelable_invariants.v iris/base_logic/lib/cancelable_invariants.v
...@@ -103,12 +114,14 @@ iris/base_logic/lib/proph_map.v ...@@ -103,12 +114,14 @@ iris/base_logic/lib/proph_map.v
iris/base_logic/lib/ghost_var.v iris/base_logic/lib/ghost_var.v
iris/base_logic/lib/mono_nat.v iris/base_logic/lib/mono_nat.v
iris/base_logic/lib/gset_bij.v iris/base_logic/lib/gset_bij.v
iris/base_logic/lib/ghost_map.v
iris/base_logic/lib/later_credits.v
iris/base_logic/lib/token.v
iris/program_logic/adequacy.v iris/program_logic/adequacy.v
iris/program_logic/lifting.v iris/program_logic/lifting.v
iris/program_logic/weakestpre.v iris/program_logic/weakestpre.v
iris/program_logic/total_weakestpre.v iris/program_logic/total_weakestpre.v
iris/program_logic/total_adequacy.v iris/program_logic/total_adequacy.v
iris/program_logic/hoare.v
iris/program_logic/language.v iris/program_logic/language.v
iris/program_logic/ectx_language.v iris/program_logic/ectx_language.v
iris/program_logic/ectxi_language.v iris/program_logic/ectxi_language.v
...@@ -119,6 +132,7 @@ iris/program_logic/total_ectx_lifting.v ...@@ -119,6 +132,7 @@ iris/program_logic/total_ectx_lifting.v
iris/program_logic/atomic.v iris/program_logic/atomic.v
iris/proofmode/base.v iris/proofmode/base.v
iris/proofmode/ident_name.v iris/proofmode/ident_name.v
iris/proofmode/string_ident.v
iris/proofmode/tokens.v iris/proofmode/tokens.v
iris/proofmode/coq_tactics.v iris/proofmode/coq_tactics.v
iris/proofmode/ltac_tactics.v iris/proofmode/ltac_tactics.v
...@@ -130,19 +144,24 @@ iris/proofmode/sel_patterns.v ...@@ -130,19 +144,24 @@ iris/proofmode/sel_patterns.v
iris/proofmode/tactics.v iris/proofmode/tactics.v
iris/proofmode/notation.v iris/proofmode/notation.v
iris/proofmode/classes.v iris/proofmode/classes.v
iris/proofmode/classes_make.v
iris/proofmode/class_instances.v iris/proofmode/class_instances.v
iris/proofmode/class_instances_later.v iris/proofmode/class_instances_later.v
iris/proofmode/class_instances_updates.v iris/proofmode/class_instances_updates.v
iris/proofmode/class_instances_embedding.v iris/proofmode/class_instances_embedding.v
iris/proofmode/class_instances_plainly.v iris/proofmode/class_instances_plainly.v
iris/proofmode/class_instances_internal_eq.v iris/proofmode/class_instances_internal_eq.v
iris/proofmode/frame_instances.v iris/proofmode/class_instances_frame.v
iris/proofmode/class_instances_make.v
iris/proofmode/monpred.v iris/proofmode/monpred.v
iris/proofmode/modalities.v iris/proofmode/modalities.v
iris/proofmode/modality_instances.v iris/proofmode/modality_instances.v
iris/proofmode/proofmode.v
iris_heap_lang/locations.v iris_heap_lang/locations.v
iris_heap_lang/lang.v iris_heap_lang/lang.v
iris_heap_lang/class_instances.v
iris_heap_lang/pretty.v
iris_heap_lang/metatheory.v iris_heap_lang/metatheory.v
iris_heap_lang/tactics.v iris_heap_lang/tactics.v
iris_heap_lang/primitive_laws.v iris_heap_lang/primitive_laws.v
...@@ -156,8 +175,10 @@ iris_heap_lang/lib/spawn.v ...@@ -156,8 +175,10 @@ iris_heap_lang/lib/spawn.v
iris_heap_lang/lib/par.v iris_heap_lang/lib/par.v
iris_heap_lang/lib/assert.v iris_heap_lang/lib/assert.v
iris_heap_lang/lib/lock.v iris_heap_lang/lib/lock.v
iris_heap_lang/lib/rw_lock.v
iris_heap_lang/lib/spin_lock.v iris_heap_lang/lib/spin_lock.v
iris_heap_lang/lib/ticket_lock.v iris_heap_lang/lib/ticket_lock.v
iris_heap_lang/lib/rw_spin_lock.v
iris_heap_lang/lib/nondet_bool.v iris_heap_lang/lib/nondet_bool.v
iris_heap_lang/lib/lazy_coin.v iris_heap_lang/lib/lazy_coin.v
iris_heap_lang/lib/clairvoyant_coin.v iris_heap_lang/lib/clairvoyant_coin.v
...@@ -167,3 +188,14 @@ iris_heap_lang/lib/increment.v ...@@ -167,3 +188,14 @@ iris_heap_lang/lib/increment.v
iris_heap_lang/lib/diverge.v iris_heap_lang/lib/diverge.v
iris_heap_lang/lib/arith.v iris_heap_lang/lib/arith.v
iris_heap_lang/lib/array.v iris_heap_lang/lib/array.v
iris_heap_lang/lib/logatom_lock.v
iris_unstable/algebra/list.v
iris_unstable/base_logic/algebra.v
iris_unstable/base_logic/mono_list.v
iris_unstable/heap_lang/interpreter.v
iris_deprecated/base_logic/auth.v
iris_deprecated/base_logic/sts.v
iris_deprecated/base_logic/viewshifts.v
iris_deprecated/program_logic/hoare.v
__pycache__
build-times*
gitlab-extract
#!/usr/bin/env python3
import argparse, sys, pprint, itertools, subprocess
import requests
import parse_log
# read command-line arguments
parser = argparse.ArgumentParser(description='Export iris-coq build times to grafana')
parser.add_argument("-f", "--file",
dest="file", required=True,
help="Filename to get the data from.")
parser.add_argument("-c", "--commits",
dest="commits",
help="Restrict the graph to the given commits.")
parser.add_argument("-p", "--project",
dest="project", required=True,
help="Project name sent to the server.")
parser.add_argument("-b", "--branch",
dest="branch", required=True,
help="Branch name sent to the server.")
parser.add_argument("--config",
dest="config", required=True,
help="The config string.")
parser.add_argument("-s", "--server",
dest="server", required=True,
help="The server (URL) to send the data to.")
parser.add_argument("-u", "--user",
dest="user", required=True,
help="Username for HTTP auth.")
parser.add_argument("--password",
dest="password", required=True,
help="Password for HTTP auth.")
args = parser.parse_args()
pp = pprint.PrettyPrinter()
log_file = sys.stdin if args.file == "-" else open(args.file, "r")
results = parse_log.parse(log_file, parse_times = parse_log.PARSE_RAW)
if args.commits:
commits = set(parse_log.parse_git_commits(args.commits))
results = filter(lambda r: r.commit in commits, results)
results = list(results)
for datapoint in results:
times = '\n'.join(datapoint.times)
commit = datapoint.commit
print("Sending {}...".format(commit), end='')
date = subprocess.check_output(['git', 'show', commit, '-s', '--pretty=%cI']).strip().decode('UTF-8')
headers = {'X-Project': args.project, 'X-Branch': args.branch, 'X-Commit': commit, 'X-Config': args.config, 'X-Date': date}
r = requests.post(args.server+"/build_times", data=times, headers=headers, auth=(args.user, args.password))
print(" {}".format(r.text.strip()))
r.raise_for_status()
#!/usr/bin/env python3
import argparse, pprint, sys, glob, zipfile, subprocess
import requests
import parse_log
def last(it):
r = None
for i in it:
r = i
return r
def first(it):
for i in it:
return i
return None
def req(path):
url = '%s/api/v3/%s' % (args.server, path)
r = requests.get(url, headers={'PRIVATE-TOKEN': args.private_token})
r.raise_for_status()
return r
# read command-line arguments
parser = argparse.ArgumentParser(description='Extract iris-coq build logs from GitLab')
parser.add_argument("-t", "--private-token",
dest="private_token", required=True,
help="The private token used to authenticate access.")
parser.add_argument("-s", "--server",
dest="server", default="https://gitlab.mpi-sws.org/",
help="The GitLab server to contact.")
parser.add_argument("-p", "--project",
dest="project", default="FP/iris-coq",
help="The name of the project on GitLab.")
parser.add_argument("-f", "--file",
dest="file", required=True,
help="Filename to store the load in.")
parser.add_argument("-c", "--commits",
dest="commits",
help="The commits to fetch. Default is everything since the most recent entry in the log file.")
parser.add_argument("-a", "--artifacts",
dest="artifacts",
help="Location of the artifacts (following GitLab's folder structure). If not given (which should be the common case), the artifacts will be downloaded from GitLab.")
parser.add_argument("-b", "--blacklist-branch",
dest="blacklist_branch",
help="Skip the commit if it is contained in the given branch.")
args = parser.parse_args()
log_file = sys.stdout if args.file == "-" else open(args.file, "a")
# determine commit, if missing
if args.commits is None:
if args.file == "-":
raise Exception("If you do not give explicit commits, you have to give a logfile so that we can determine the missing commits.")
last_result = last(parse_log.parse(open(args.file, "r"), parse_times = parse_log.PARSE_NOT))
args.commits = "{}..origin/master".format(last_result.commit)
projects = req("projects?per_page=512")
project = first(filter(lambda p: p['path_with_namespace'] == args.project, projects.json()))
if project is None:
sys.stderr.write("Project not found.\n")
sys.exit(1)
BREAK = False
for commit in parse_log.parse_git_commits(args.commits):
if BREAK:
break
# test to skip the commit
if args.blacklist_branch is not None:
branches = subprocess.check_output(["git", "branch", "-r", "--contains", commit]).decode("utf-8")
if args.blacklist_branch in map(lambda x: x.strip(), branches.split('\n')):
continue
# Find out more about the commit
print("Fetching {}...".format(commit), end='')
commit_data = req("/projects/{}/repository/commits/{}".format(project['id'], commit))
if commit_data.status_code != 200:
raise Exception("Commit not found?")
builds = req("/projects/{}/repository/commits/{}/builds".format(project['id'], commit))
if builds.status_code != 200:
raise Exception("Build not found?")
# iterate over builds by decreasing ID, and look for the artifact
found_build = False
for build in builds.json():
if build['status'] in ('created', 'pending', 'running'):
# build still not yet done, don't fetch this or any later commit
BREAK = True
print(" build still in progress, aborting")
break
if build['status'] != 'success':
# build failed or cancelled, skip to next
continue
# now fetch the build times
if args.artifacts:
artifact_zip = glob.glob('{}/*/{}/{}/artifacts.zip'.format(args.artifacts, project['id'], build['id']))
if not artifact_zip:
# no artifact at this build, try another one
continue
assert len(artifact_zip) == 1, "Found too many artifacts"
artifact_zip = artifact_zip[0]
with zipfile.ZipFile(artifact_zip) as artifact:
with artifact.open('build-time.txt') as build_times:
# Output into log file
log_file.write("# {}\n".format(commit))
log_file.write(build_times.read().decode('UTF-8'))
log_file.flush()
else:
build_times = requests.get("{}/builds/{}/artifacts/raw/build-time.txt".format(project['web_url'], build['id']))
if build_times.status_code != 200:
# no artifact at this build, try another one
continue
# Output in the log file format
log_file.write("# {}\n".format(commit))
log_file.write(build_times.text)
log_file.flush()
# don't fetch another build
found_build = True
print(" success")
break
if not found_build and not BREAK:
print(" found no succeessful build")
import re, subprocess
class Result:
def __init__(self, commit, times):
self.commit = commit
self.times = times
PARSE_NOT = 0
PARSE_RAW = 1
PARSE_FULL = 2
def parse(file, parse_times = PARSE_FULL):
'''[file] should be a file-like object, an iterator over the lines.
yields a list of Result objects.'''
commit_re = re.compile("^# ([a-z0-9]+)$")
time_re = re.compile("^([a-zA-Z0-9_/-]+) \((real|user): ([0-9.]+).* mem: ([0-9]+) ko\)$")
commit = None
times = None
for line in file:
line = line.strip()
# next commit?
m = commit_re.match(line)
if m is not None:
# previous commit, if any, is done now
if commit is not None:
yield Result(commit, times)
# start recording next commit
commit = m.group(1)
if parse_times != PARSE_NOT:
times = [] if parse_times == PARSE_RAW else {} # reset the recorded times
continue
# next file time?
m = time_re.match(line)
if m is not None:
if times is not None:
if parse_times == PARSE_RAW:
times.append(line)
else:
name = m.group(1)
time = float(m.group(2))
times[name] = time
continue
# nothing else we know about, ignore
print("Ignoring line",line,"(in commit {})".format(commit))
# end of file. previous commit, if any, is done now.
if commit is not None:
yield Result(commit, times)
def parse_git_commits(commits):
'''Returns an iterable of SHA1s'''
if commits.find('..') >= 0:
# a range of commits
commits = subprocess.check_output(["git", "rev-list", commits])
else:
# a single commit
commits = subprocess.check_output(["git", "rev-parse", commits])
output = commits.decode("utf-8").strip()
if not output: # empty output
return []
return reversed(output.split('\n'))
#!/usr/bin/env python3
import argparse, sys, pprint, itertools
import matplotlib.pyplot as plt
import parse_log
markers = itertools.cycle([(3, 0), (3, 0, 180), (4, 0), (4, 0, 45), (8, 0)])
# read command-line arguments
parser = argparse.ArgumentParser(description='Visualize iris-coq build times')
parser.add_argument("-f", "--file",
dest="file", required=True,
help="Filename to get the data from.")
parser.add_argument("-t", "--timings", nargs='+',
dest="timings",
help="The names of the Coq files (with or without the extension) whose timings should be extracted")
parser.add_argument("-c", "--commits",
dest="commits",
help="Restrict the graph to the given commits.")
args = parser.parse_args()
pp = pprint.PrettyPrinter()
log_file = sys.stdin if args.file == "-" else open(args.file, "r")
results = parse_log.parse(log_file, parse_times = parse_log.PARSE_FULL)
if args.commits:
commits = set(parse_log.parse_git_commits(args.commits))
results = filter(lambda r: r.commit in commits, results)
results = list(results)
timings = list(map(lambda t: t[:-2] if t.endswith(".v") else t, args.timings))
for timing in timings:
plt.plot(list(map(lambda r: r.times.get(timing), results)), marker=next(markers), markersize=8)
plt.legend(timings, loc = 'upper left', bbox_to_anchor=(1.05, 1.0))
plt.xticks(range(len(results)), list(map(lambda r: r.commit[:7], results)), rotation=70)
plt.subplots_adjust(bottom=0.2, right=0.7) # more space for the commit labels and legend
plt.xlabel('Commit')
plt.ylabel('Time (s)')
plt.title('Time to compile files')
plt.grid(True)
plt.show()
#!/usr/bin/python3
import sys, os
import requests
# A script to build Iris' reverse-dependencies (the one that usually get built every night against Iris master)
# against a branch of your choice.
# Set the GITLAB_TOKEN environment variable to a GitLab access token.
# Set at least one of IRIS_REV or STDPP_REV to control which branches of these projects to build against
# (default to `master`).
if not "GITLAB_TOKEN" in os.environ:
print("You need to set the GITLAB_TOKEN environment variable to a GitLab access token.")
print("You can create such tokens at <https://gitlab.mpi-sws.org/profile/personal_access_tokens>.")
print("Make sure you grant access to the 'api' scope.")
sys.exit(1)
if not "IRIS_REV" in os.environ:
print("Please set IRIS_REV, STDPP_REV, ORC11_REV and GPFSL_REV environment variables to the branch/tag/commit of the respective project that you want to use.")
print("Only IRIS_REV is mandatory, the rest defaults to 'master'.")
sys.exit(1)
GITLAB_TOKEN = os.environ["GITLAB_TOKEN"]
PROJECTS = [
{ 'name': 'lambda-rust', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'lambda-rust', 'branch': 'masters/weak_mem', 'vars': ['STDPP_REV', 'IRIS_REV', 'ORC11_REV', 'GPFSL_REV'] }, # covers GPFSL and ORC11
{ 'name': 'examples', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'iron', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'reloc', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'c', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'spygame', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'time-credits', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'actris', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'ora', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
{ 'name': 'tutorial-popl18', 'branch': 'master', 'vars': ['STDPP_REV', 'IRIS_REV'] },
]
for project in PROJECTS:
print("Triggering build for {}{}...".format(project['name'], '' if project['branch'] == 'master' else ':'+project['branch']))
id = str(project['id']) if 'id' in project else "iris%2F{}".format(project['name'])
url = "https://gitlab.mpi-sws.org/api/v4/projects/{}/pipeline".format(id)
json = {
'ref': project['branch'],
'variables': list(map(lambda var: { 'key': var, 'value': os.environ.get(var, "master") }, project['vars'])),
}
r = requests.post(url, headers={'PRIVATE-TOKEN': GITLAB_TOKEN}, json=json)
r.raise_for_status()
print(" Pipeline running at {}".format(r.json()['web_url']))
opam-version: "2.0"
maintainer: "Ralf Jung <jung@mpi-sws.org>"
authors: "The Iris Team"
license: "BSD-3-Clause"
homepage: "https://iris-project.org/"
bug-reports: "https://gitlab.mpi-sws.org/iris/iris/issues"
dev-repo: "git+https://gitlab.mpi-sws.org/iris/iris.git"
version: "dev"
synopsis: "Deprecated Iris libraries"
description: """
This package contains libraries that have been deprecated from Iris, and are planned to be
entirely removed at some point.
"""
depends: [
"coq-iris" {= version}
]
build: ["./make-package" "iris_deprecated" "-j%{jobs}%"]
install: ["./make-package" "iris_deprecated" "install"]
...@@ -5,11 +5,16 @@ license: "BSD-3-Clause" ...@@ -5,11 +5,16 @@ license: "BSD-3-Clause"
homepage: "https://iris-project.org/" homepage: "https://iris-project.org/"
bug-reports: "https://gitlab.mpi-sws.org/iris/iris/issues" bug-reports: "https://gitlab.mpi-sws.org/iris/iris/issues"
dev-repo: "git+https://gitlab.mpi-sws.org/iris/iris.git" dev-repo: "git+https://gitlab.mpi-sws.org/iris/iris.git"
version: "dev"
synopsis: "HeapLang is the canonical example language for Iris" synopsis: "The canonical example language for Iris"
description: """ description: """
This package provides the iris.heap_lang Coq module. This package defines HeapLang, a concurrent lambda calculus with references, and
uses Iris to build a program logic for HeapLang programs.
""" """
tags: [
"logpath:iris.heap_lang"
]
depends: [ depends: [
"coq-iris" {= version} "coq-iris" {= version}
......
opam-version: "2.0"
maintainer: "Ralf Jung <jung@mpi-sws.org>"
authors: "The Iris Team"
license: "BSD-3-Clause"
homepage: "https://iris-project.org/"
bug-reports: "https://gitlab.mpi-sws.org/iris/iris/issues"
dev-repo: "git+https://gitlab.mpi-sws.org/iris/iris.git"
version: "dev"
synopsis: "Unfinished Iris libraries"
description: """
This package contains libraries that have been proposed for inclusion in Iris, but more
work is needed before they are ready for this.
"""
depends: [
"coq-iris" {= version}
"coq-iris-heap-lang" {= version}
]
build: ["./make-package" "iris_unstable" "-j%{jobs}%"]
install: ["./make-package" "iris_unstable" "install"]