- Sep 21, 2017
-
-
Robbert Krebbers authored
-
- Sep 20, 2017
-
-
Robbert Krebbers authored
-
Robbert Krebbers authored
In order to do that, we need to quantify over non-expansive predicates instead of arbitrary predicates.
-
- Sep 18, 2017
-
-
Robbert Krebbers authored
That caused some problems, e.g.: From iris.base_logic Require Export fix. Gave: Syntax error: [constr:global] expected after [export_token] (in [vernac:gallina_ext]).
-
Robbert Krebbers authored
-
- Sep 17, 2017
-
-
Robbert Krebbers authored
-
Robbert Krebbers authored
-
Robbert Krebbers authored
-
- Aug 28, 2017
-
-
Robbert Krebbers authored
- Use Φ and Ψ for predicates. - Use _1 and _2 suffixes for the different directions of a lemma. - Not all lemmas started with _uPred; we do not let the bigop lemmas (for instance) start with uPred_ either, so I just got rid of the prefix.
-
- Aug 24, 2017
- Aug 23, 2017
-
-
Ralf Jung authored
-
- Aug 22, 2017
-
-
Ralf Jung authored
Implementation is by Robbert <FP/iris-atomic!5 (comment 19496)>
-
- Aug 20, 2017
-
-
Robbert Krebbers authored
This makes it easier to frame or introduce some modalities before introducing universal quantifiers.
-
- Aug 17, 2017
-
-
Robbert Krebbers authored
-
- Aug 07, 2017
-
-
Jacques-Henri Jourdan authored
-
Jacques-Henri Jourdan authored
-
Jacques-Henri Jourdan authored
-
Jacques-Henri Jourdan authored
-
- Aug 06, 2017
-
-
Jacques-Henri Jourdan authored
-
- Jun 27, 2017
-
-
Robbert Krebbers authored
-
- Jun 13, 2017
-
-
Robbert Krebbers authored
-
Robbert Krebbers authored
-
Robbert Krebbers authored
It can be derived, thanks to Ales for noticing!
-
- Jun 12, 2017
-
-
Robbert Krebbers authored
-
- Jun 08, 2017
-
-
Robbert Krebbers authored
-
- May 12, 2017
-
-
Robbert Krebbers authored
-
Robbert Krebbers authored
-
- Apr 13, 2017
-
-
Robbert Krebbers authored
This enables things like `iSpecialize ("H2" with "H1") in the below: "H1" : P ---------□ "H2" : □ P -∗ Q ---------∗ R
-
- Apr 11, 2017
- Apr 07, 2017
-
-
Ralf Jung authored
-
Jacques-Henri Jourdan authored
-
- Apr 05, 2017
-
-
Jacques-Henri Jourdan authored
-
- Apr 04, 2017
-
-
Jacques-Henri Jourdan authored
-
- Mar 27, 2017
-
-
Robbert Krebbers authored
-
- Mar 24, 2017
-
-
Robbert Krebbers authored
This commit fixes the issues that refolding of big operators did not work nicely in the proof mode, e.g., given: Goal forall M (P : nat → uPred M) l, ([∗ list] x ∈ 10 :: l, P x) -∗ True. Proof. iIntros (M P l) "[H1 H2]". We got: "H1" : P 10 "H2" : (fix big_opL (M0 : ofeT) (o : M0 → M0 → M0) (H : Monoid o) (A : Type) (f : nat → A → M0) (xs : list A) {struct xs} : M0 := match xs with | [] => monoid_unit | x :: xs0 => o (f 0 x) (big_opL M0 o H A (λ n : nat, f (S n)) xs0) end) (uPredC M) uPred_sep uPred.uPred_sep_monoid nat (λ _ x : nat, P x) l --------------------------------------∗ True The problem here is that proof mode looked for an instance of `IntoAnd` for `[∗ list] x ∈ 10 :: l, P x` and then applies the instance for separating conjunction without folding back the fixpoint. This problem is not specific to the Iris proof mode, but more of a general problem of Coq's `apply`, for example: Goal forall x l, Forall (fun _ => True) (map S (x :: l)). Proof. intros x l. constructor. Gives: Forall (λ _ : nat, True) ((fix map (l0 : list nat) : list nat := match l0 with | [] => [] | a :: t => S a :: map t end) l) This commit fixes this issue by making the big operators type class opaque and instead handle them solely via corresponding type classes instances for the proof mode tactics. Furthermore, note that we already had instances for persistence and timelessness. Those were really needed; computation did not help to establish persistence when the list in question was not a ground term. In fact, the sitation was worse, to establish persistence of `[∗ list] x ∈ 10 :: l, P x` it could either use the persistence instance of big ops directly, or use the persistency instance for `∗` first. Worst case, this can lead to an exponential blow up because of back tracking.
-
Robbert Krebbers authored
-
Robbert Krebbers authored
Instead, I have introduced a type class `Monoid` that is used by the big operators: Class Monoid {M : ofeT} (o : M → M → M) := { monoid_unit : M; monoid_ne : NonExpansive2 o; monoid_assoc : Assoc (≡) o; monoid_comm : Comm (≡) o; monoid_left_id : LeftId (≡) monoid_unit o; monoid_right_id : RightId (≡) monoid_unit o; }. Note that the operation is an argument because we want to have multiple monoids over the same type (for example, on `uPred`s we have monoids for `∗`, `∧`, and `∨`). However, we do bundle the unit because: - If we would not, the unit would appear explicitly in an implicit argument of the big operators, which confuses rewrite. By bundling the unit in the `Monoid` class it is hidden, and hence rewrite won't even see it. - The unit is unique. We could in principle have big ops over setoids instead of OFEs. However, since we do not have a canonical structure for bundled setoids, I did not go that way.
-