Skip to content
Snippets Groups Projects
locations.v 1.59 KiB
Newer Older
Amin Timany's avatar
Amin Timany committed
From stdpp Require Import countable numbers gmap.
From iris.prelude Require Export prelude.
Ralf Jung's avatar
Ralf Jung committed
From iris.prelude Require Import options.
Record loc := Loc { loc_car : Z }.

Add Printing Constructor loc.
Global Instance loc_eq_decision : EqDecision loc.
Proof. solve_decision. Defined.
Global Instance loc_inhabited : Inhabited loc := populate {|loc_car := 0 |}.
Global Instance loc_countable : Countable loc.
Proof. by apply (inj_countable' loc_car Loc); intros []. Defined.
Program Instance loc_infinite : Infinite loc :=
  inj_infinite (λ p, {| loc_car := p |}) (λ l, Some (loc_car l)) _.
Next Obligation. done. Qed.
Amin Timany's avatar
Amin Timany committed
Definition loc_add (l : loc) (off : Z) : loc :=
  {| loc_car := loc_car l + off|}.

Notation "l +ₗ off" :=
  (loc_add l off) (at level 50, left associativity) : stdpp_scope.
Amin Timany's avatar
Amin Timany committed

Lemma loc_add_assoc l i j : l + i + j = l + (i + j).
Proof. destruct l; rewrite /loc_add /=; f_equal; lia. Qed.

Lemma loc_add_0 l : l + 0 = l.
Proof. destruct l; rewrite /loc_add /=; f_equal; lia. Qed.

Global Instance loc_add_inj l : Inj eq eq (loc_add l).
Amin Timany's avatar
Amin Timany committed
Proof. destruct l; rewrite /Inj /loc_add /=; intros; simplify_eq; lia. Qed.

Definition fresh_locs (ls : gset loc) : loc :=
  {| loc_car := set_fold (λ k r, (1 + loc_car k) `max` r)%Z 1%Z ls |}.
Lemma fresh_locs_fresh ls i :
  (0  i)%Z  fresh_locs ls + i  ls.
Amin Timany's avatar
Amin Timany committed
Proof.
  intros Hi. cut ( l, l  ls  loc_car l < loc_car (fresh_locs ls) + i)%Z.
  { intros help Hf%help. simpl in *. lia. }
  apply (set_fold_ind_L (λ r ls,  l, l  ls  (loc_car l < r + i)%Z));
    set_solver by eauto with lia.
Amin Timany's avatar
Amin Timany committed
Qed.

Global Opaque fresh_locs.