Library zoo.language.language
Require Import zoo.prelude.
Require Export zoo.language.semantics.
Require Import zoo.options.
Implicit Type e : expr.
Implicit Type es : list expr.
Implicit Type v : val.
Implicit Type σ : state.
Implicit Type κ κs : list observation.
Implicit Type k : ectxi.
Implicit Type K : ectx.
Implicit Type ρ : config.
Declare Scope expr_scope.
Delimit Scope expr_scope with E.
Bind Scope expr_scope with expr.
Declare Scope val_scope.
Delimit Scope val_scope with V.
Bind Scope val_scope with val.
Class AsVal e v :=
as_val : of_val v = e.
Variant prim_step tid e1 σ1 κ e2 σ2 es : Prop :=
| base_stepーfillーprim_step' K e1' e2' :
e1 = fill K e1' →
e2 = fill K e2' →
base_step tid e1' σ1 κ e2' σ2 es →
prim_step tid e1 σ1 κ e2 σ2 es.
#[global] Arguments base_stepーfillーprim_step' {_ _ _ _ _ _ _}.
Definition step ρ1 κ ρ2 :=
∃ tid e1 e2 σ2 es,
prim_step tid e1 ρ1.2 κ e2 σ2 es ∧
ρ1.1 !! tid = Some e1 ∧
ρ2 = (<[tid := e2]> ρ1.1 ++ es, σ2).
Inductive nsteps : nat → config → list observation → config → Prop :=
| nstepsーrefl ρ :
nsteps 0 ρ [] ρ
| nstepsーl n ρ1 ρ2 ρ3 κ κs :
step ρ1 κ ρ2 →
nsteps n ρ2 κs ρ3 →
nsteps ˖n ρ1 (κ ++ κs) ρ3.
#[local] Hint Constructors nsteps : core.
Definition silent_step ρ1 ρ2 :=
∃ κ,
step ρ1 κ ρ2.
Definition base_reducible tid e σ :=
∃ κ e' σ' es,
base_step tid e σ κ e' σ' es.
Definition base_reducible_no_obs tid e σ :=
∃ e' σ' es,
base_step tid e σ [] e' σ' es.
Definition base_irreducible tid e σ :=
∀ κ e' σ' es,
¬ base_step tid e σ κ e' σ' es.
Definition base_stuck tid e σ :=
to_val e = None ∧
base_irreducible tid e σ.
Definition base_atomic e :=
∀ tid σ κ e' σ' es,
base_step tid e σ κ e' σ' es →
is_Some (to_val e').
Record pure_base_step e1 e2 :=
{ pure_base_stepーsafe tid σ1 :
base_reducible_no_obs tid e1 σ1
; pure_base_stepーdet tid σ1 κ e2' σ2 es :
base_step tid e1 σ1 κ e2' σ2 es →
κ = [] ∧
σ2 = σ1 ∧
e2' = e2 ∧
es = []
}.
Definition reducible tid e σ :=
∃ κ e' σ' es,
prim_step tid e σ κ e' σ' es.
Definition reducible_no_obs tid e σ :=
∃ e' σ' es,
prim_step tid e σ [] e' σ' es.
Definition irreducible tid e σ :=
∀ κ e' σ' es,
¬ prim_step tid e σ κ e' σ' es.
Definition stuck tid e σ :=
to_val e = None ∧
irreducible tid e σ.
Definition not_stuck tid e σ :=
is_Some (to_val e) ∨
reducible tid e σ.
Class Atomic e :=
atomic tid σ e' κ σ' es :
prim_step tid e σ κ e' σ' es →
is_Some (to_val e').
Definition safe ρ :=
∀ ρ',
rtc silent_step ρ ρ' →
Foralli (λ tid e, not_stuck tid e ρ'.2) ρ'.1.
Record pure_step e1 e2 :=
{ pure_stepーsafe tid σ1 :
reducible_no_obs tid e1 σ1
; pure_stepーdet tid σ1 κ e2' σ2 es :
prim_step tid e1 σ1 κ e2' σ2 es →
κ = [] ∧
σ2 = σ1 ∧
e2' = e2 ∧
es = []
}.
Class Context (K : expr → expr) :=
{ contextーfillーnot_val e :
to_val e = None →
to_val (K e) = None
; contextーfillーstep tid e1 σ1 κ e2 σ2 es :
prim_step tid e1 σ1 κ e2 σ2 es →
prim_step tid (K e1) σ1 κ (K e2) σ2 es
; contextーfillーstepーinv tid e1' σ1 κ e2 σ2 es :
to_val e1' = None →
prim_step tid (K e1') σ1 κ e2 σ2 es →
∃ e2',
e2 = K e2' ∧
prim_step tid e1' σ1 κ e2' σ2 es
}.
Class PureExec (ϕ : Prop) n e1 e2 :=
pure_exec :
ϕ →
relations.nsteps pure_step n e1 e2.
Definition sub_redexes_are_values e :=
∀ K e', e = fill K e' →
to_val e' = None →
K = [].
#[global] Instance filliーinj k :
Inj (=) (=) (filli k).
Lemma filliーval k e :
is_Some (to_val (filli k e)) →
is_Some (to_val e).
Lemma filliーno_valーinj k1 e1 k2 e2 :
to_val e1 = None →
to_val e2 = None →
filli k1 e1 = filli k2 e2 →
k1 = k2.
Lemma base_stepーfilliーval tid k e σ1 κ e2 σ2 es :
base_step tid (filli k e) σ1 κ e2 σ2 es →
is_Some (to_val e).
#[global] Instance fillーinj K :
Inj (=) (=) (fill K).
Lemma fillーnil e :
fill [] e = e.
Lemma fillーapp K1 K2 e :
fill (K1 ++ K2) e = fill K2 (fill K1 e).
Lemma fillーval K e :
is_Some (to_val (fill K e)) →
is_Some (to_val e).
Lemma fillーnot_val K e :
to_val e = None →
to_val (fill K e) = None.
Lemma base_stepーnot_val tid e1 σ1 κ e2 σ2 es :
base_step tid e1 σ1 κ e2 σ2 es →
to_val e1 = None.
Lemma stepーbyーval tid K1 K2 e1 e2 σ1 κ e2' σ2 es :
fill K1 e1 = fill K2 e2 →
to_val e1 = None →
base_step tid e2 σ1 κ e2' σ2 es →
∃ K,
K2 = K ++ K1.
Lemma base_stepーfillーval tid K e σ1 κ e2 σ2 es :
base_step tid (fill K e) σ1 κ e2 σ2 es →
is_Some (to_val e) ∨
K = [].
Lemma base_reducible_no_obsーbase_reducible tid e σ :
base_reducible_no_obs tid e σ →
base_reducible tid e σ.
Lemma base_stepーprim_step tid e1 σ1 κ e2 σ2 es :
base_step tid e1 σ1 κ e2 σ2 es →
prim_step tid e1 σ1 κ e2 σ2 es.
Lemma prim_stepーnot_val tid e σ κ e' σ' es :
prim_step tid e σ κ e' σ' es →
to_val e = None.
Lemma reducibleーnot_val tid e σ :
reducible tid e σ →
to_val e = None.
Lemma reducible_no_obsーreducible tid e σ :
reducible_no_obs tid e σ →
reducible tid e σ.
Lemma base_reducibleーreducible tid e σ :
base_reducible tid e σ →
reducible tid e σ.
Lemma base_atomicーatomic e :
base_atomic e →
sub_redexes_are_values e →
Atomic e.
Lemma base_reducibleーfillーprim_step tid K e1 σ1 κ e2 σ2 es :
base_reducible tid e1 σ1 →
prim_step tid (fill K e1) σ1 κ e2 σ2 es →
∃ e2',
e2 = fill K e2' ∧
base_step tid e1 σ1 κ e2' σ2 es.
Lemma base_reducibleーprim_step tid e1 σ1 κ e2 σ2 es :
base_reducible tid e1 σ1 →
prim_step tid e1 σ1 κ e2 σ2 es →
base_step tid e1 σ1 κ e2 σ2 es.
Lemma pure_base_stepーpure_step e1 e2 :
pure_base_step e1 e2 →
pure_step e1 e2.
#[global] Instance contextーid :
Context (@id expr).
#[global] Instance contextーfill K :
Context (fill K).
#[global] Instance contextーfilli k :
Context (filli k).
Lemma reducibleーcontext (K : expr → expr) `{!Context K} tid e σ :
reducible tid e σ →
reducible tid (K e) σ.
Lemma reducibleーcontextーinv (K : expr → expr) `{!Context K} tid e σ :
to_val e = None →
reducible tid (K e) σ →
reducible tid e σ.
Lemma pure_stepーcontext (K : expr → expr) `{!Context K} e1 e2 :
pure_step e1 e2 →
pure_step (K e1) (K e2).
Lemma pure_stepーnstepsーcontext (K : expr → expr) `{!Context K} n e1 e2 :
relations.nsteps pure_step n e1 e2 →
relations.nsteps pure_step n (K e1) (K e2).
Lemma pure_execーcontext (K : expr → expr) `{!Context K} ϕ n e1 e2 :
PureExec ϕ n e1 e2 →
PureExec ϕ n (K e1) (K e2).
Lemma pure_execーfill K ϕ n e1 e2 :
PureExec ϕ n e1 e2 →
PureExec ϕ n (fill K e1) (fill K e2).
Lemma sub_redexes_are_valuesーalt e :
( ∀ k e',
e = filli k e' →
is_Some (to_val e')
) →
sub_redexes_are_values e.
Lemma to_valーfillーSome K e v :
to_val (fill K e) = Some v →
K = [] ∧ e = Val v.
Lemma prim_stepーto_valーisーbase_step tid e σ1 κ v σ2 es :
prim_step tid e σ1 κ (Val v) σ2 es →
base_step tid e σ1 κ (Val v) σ2 es.
Lemma silent_stepsーnsteps ρ1 ρ2 :
rtc silent_step ρ1 ρ2 ↔
∃ n κs,
nsteps n ρ1 κs ρ2.
Lemma stepーlength ρ1 κ ρ2 :
step ρ1 κ ρ2 →
length ρ1.1 ≤ length ρ2.1.
Lemma nstepsーlength n ρ1 κs ρ2 :
nsteps n ρ1 κs ρ2 →
length ρ1.1 ≤ length ρ2.1.
Lemma base_reducible_no_obsーequal tid v1 v2 σ :
base_reducible_no_obs tid (Equal (Val v1) (Val v2)) σ.
Lemma base_reducibleーequal tid v1 v2 σ :
base_reducible tid (Equal (Val v1) (Val v2)) σ.
Lemma reducibleーequal tid v1 v2 σ :
reducible tid (Equal (Val v1) (Val v2)) σ.
Lemma base_reducible_no_obsーcas tid l fld v1 v2 v σ :
σ.(state۰heap) !! (l +ₗ fld) = Some v →
base_reducible_no_obs tid (CAS (Val $ ValTuple [ValLoc l; ValInt fld]) (Val v1) (Val v2)) σ.
Lemma base_reducibleーcas tid l fld v1 v2 v σ :
σ.(state۰heap) !! (l +ₗ fld) = Some v →
base_reducible tid (CAS (Val $ ValTuple [ValLoc l; ValInt fld]) (Val v1) (Val v2)) σ.
Lemma reducibleーcas tid l fld v1 v2 v σ :
σ.(state۰heap) !! (l +ₗ fld) = Some v →
reducible tid (CAS (Val $ ValTuple [ValLoc l; ValInt fld]) (Val v1) (Val v2)) σ.
Lemma reducibleーresolve tid e σ pid v :
Atomic e →
reducible tid e σ →
reducible tid (Resolve e (Val $ ValProph pid) (Val v)) σ.
Lemma prim_stepーresolveーinv tid e v1 v2 σ1 κ e2 σ2 es :
Atomic e →
prim_step tid (Resolve e (Val v1) (Val v2)) σ1 κ e2 σ2 es →
base_step tid (Resolve e (Val v1) (Val v2)) σ1 κ e2 σ2 es.
Require Export zoo.language.semantics.
Require Import zoo.options.
Implicit Type e : expr.
Implicit Type es : list expr.
Implicit Type v : val.
Implicit Type σ : state.
Implicit Type κ κs : list observation.
Implicit Type k : ectxi.
Implicit Type K : ectx.
Implicit Type ρ : config.
Declare Scope expr_scope.
Delimit Scope expr_scope with E.
Bind Scope expr_scope with expr.
Declare Scope val_scope.
Delimit Scope val_scope with V.
Bind Scope val_scope with val.
Class AsVal e v :=
as_val : of_val v = e.
Variant prim_step tid e1 σ1 κ e2 σ2 es : Prop :=
| base_stepーfillーprim_step' K e1' e2' :
e1 = fill K e1' →
e2 = fill K e2' →
base_step tid e1' σ1 κ e2' σ2 es →
prim_step tid e1 σ1 κ e2 σ2 es.
#[global] Arguments base_stepーfillーprim_step' {_ _ _ _ _ _ _}.
Definition step ρ1 κ ρ2 :=
∃ tid e1 e2 σ2 es,
prim_step tid e1 ρ1.2 κ e2 σ2 es ∧
ρ1.1 !! tid = Some e1 ∧
ρ2 = (<[tid := e2]> ρ1.1 ++ es, σ2).
Inductive nsteps : nat → config → list observation → config → Prop :=
| nstepsーrefl ρ :
nsteps 0 ρ [] ρ
| nstepsーl n ρ1 ρ2 ρ3 κ κs :
step ρ1 κ ρ2 →
nsteps n ρ2 κs ρ3 →
nsteps ˖n ρ1 (κ ++ κs) ρ3.
#[local] Hint Constructors nsteps : core.
Definition silent_step ρ1 ρ2 :=
∃ κ,
step ρ1 κ ρ2.
Definition base_reducible tid e σ :=
∃ κ e' σ' es,
base_step tid e σ κ e' σ' es.
Definition base_reducible_no_obs tid e σ :=
∃ e' σ' es,
base_step tid e σ [] e' σ' es.
Definition base_irreducible tid e σ :=
∀ κ e' σ' es,
¬ base_step tid e σ κ e' σ' es.
Definition base_stuck tid e σ :=
to_val e = None ∧
base_irreducible tid e σ.
Definition base_atomic e :=
∀ tid σ κ e' σ' es,
base_step tid e σ κ e' σ' es →
is_Some (to_val e').
Record pure_base_step e1 e2 :=
{ pure_base_stepーsafe tid σ1 :
base_reducible_no_obs tid e1 σ1
; pure_base_stepーdet tid σ1 κ e2' σ2 es :
base_step tid e1 σ1 κ e2' σ2 es →
κ = [] ∧
σ2 = σ1 ∧
e2' = e2 ∧
es = []
}.
Definition reducible tid e σ :=
∃ κ e' σ' es,
prim_step tid e σ κ e' σ' es.
Definition reducible_no_obs tid e σ :=
∃ e' σ' es,
prim_step tid e σ [] e' σ' es.
Definition irreducible tid e σ :=
∀ κ e' σ' es,
¬ prim_step tid e σ κ e' σ' es.
Definition stuck tid e σ :=
to_val e = None ∧
irreducible tid e σ.
Definition not_stuck tid e σ :=
is_Some (to_val e) ∨
reducible tid e σ.
Class Atomic e :=
atomic tid σ e' κ σ' es :
prim_step tid e σ κ e' σ' es →
is_Some (to_val e').
Definition safe ρ :=
∀ ρ',
rtc silent_step ρ ρ' →
Foralli (λ tid e, not_stuck tid e ρ'.2) ρ'.1.
Record pure_step e1 e2 :=
{ pure_stepーsafe tid σ1 :
reducible_no_obs tid e1 σ1
; pure_stepーdet tid σ1 κ e2' σ2 es :
prim_step tid e1 σ1 κ e2' σ2 es →
κ = [] ∧
σ2 = σ1 ∧
e2' = e2 ∧
es = []
}.
Class Context (K : expr → expr) :=
{ contextーfillーnot_val e :
to_val e = None →
to_val (K e) = None
; contextーfillーstep tid e1 σ1 κ e2 σ2 es :
prim_step tid e1 σ1 κ e2 σ2 es →
prim_step tid (K e1) σ1 κ (K e2) σ2 es
; contextーfillーstepーinv tid e1' σ1 κ e2 σ2 es :
to_val e1' = None →
prim_step tid (K e1') σ1 κ e2 σ2 es →
∃ e2',
e2 = K e2' ∧
prim_step tid e1' σ1 κ e2' σ2 es
}.
Class PureExec (ϕ : Prop) n e1 e2 :=
pure_exec :
ϕ →
relations.nsteps pure_step n e1 e2.
Definition sub_redexes_are_values e :=
∀ K e', e = fill K e' →
to_val e' = None →
K = [].
#[global] Instance filliーinj k :
Inj (=) (=) (filli k).
Lemma filliーval k e :
is_Some (to_val (filli k e)) →
is_Some (to_val e).
Lemma filliーno_valーinj k1 e1 k2 e2 :
to_val e1 = None →
to_val e2 = None →
filli k1 e1 = filli k2 e2 →
k1 = k2.
Lemma base_stepーfilliーval tid k e σ1 κ e2 σ2 es :
base_step tid (filli k e) σ1 κ e2 σ2 es →
is_Some (to_val e).
#[global] Instance fillーinj K :
Inj (=) (=) (fill K).
Lemma fillーnil e :
fill [] e = e.
Lemma fillーapp K1 K2 e :
fill (K1 ++ K2) e = fill K2 (fill K1 e).
Lemma fillーval K e :
is_Some (to_val (fill K e)) →
is_Some (to_val e).
Lemma fillーnot_val K e :
to_val e = None →
to_val (fill K e) = None.
Lemma base_stepーnot_val tid e1 σ1 κ e2 σ2 es :
base_step tid e1 σ1 κ e2 σ2 es →
to_val e1 = None.
Lemma stepーbyーval tid K1 K2 e1 e2 σ1 κ e2' σ2 es :
fill K1 e1 = fill K2 e2 →
to_val e1 = None →
base_step tid e2 σ1 κ e2' σ2 es →
∃ K,
K2 = K ++ K1.
Lemma base_stepーfillーval tid K e σ1 κ e2 σ2 es :
base_step tid (fill K e) σ1 κ e2 σ2 es →
is_Some (to_val e) ∨
K = [].
Lemma base_reducible_no_obsーbase_reducible tid e σ :
base_reducible_no_obs tid e σ →
base_reducible tid e σ.
Lemma base_stepーprim_step tid e1 σ1 κ e2 σ2 es :
base_step tid e1 σ1 κ e2 σ2 es →
prim_step tid e1 σ1 κ e2 σ2 es.
Lemma prim_stepーnot_val tid e σ κ e' σ' es :
prim_step tid e σ κ e' σ' es →
to_val e = None.
Lemma reducibleーnot_val tid e σ :
reducible tid e σ →
to_val e = None.
Lemma reducible_no_obsーreducible tid e σ :
reducible_no_obs tid e σ →
reducible tid e σ.
Lemma base_reducibleーreducible tid e σ :
base_reducible tid e σ →
reducible tid e σ.
Lemma base_atomicーatomic e :
base_atomic e →
sub_redexes_are_values e →
Atomic e.
Lemma base_reducibleーfillーprim_step tid K e1 σ1 κ e2 σ2 es :
base_reducible tid e1 σ1 →
prim_step tid (fill K e1) σ1 κ e2 σ2 es →
∃ e2',
e2 = fill K e2' ∧
base_step tid e1 σ1 κ e2' σ2 es.
Lemma base_reducibleーprim_step tid e1 σ1 κ e2 σ2 es :
base_reducible tid e1 σ1 →
prim_step tid e1 σ1 κ e2 σ2 es →
base_step tid e1 σ1 κ e2 σ2 es.
Lemma pure_base_stepーpure_step e1 e2 :
pure_base_step e1 e2 →
pure_step e1 e2.
#[global] Instance contextーid :
Context (@id expr).
#[global] Instance contextーfill K :
Context (fill K).
#[global] Instance contextーfilli k :
Context (filli k).
Lemma reducibleーcontext (K : expr → expr) `{!Context K} tid e σ :
reducible tid e σ →
reducible tid (K e) σ.
Lemma reducibleーcontextーinv (K : expr → expr) `{!Context K} tid e σ :
to_val e = None →
reducible tid (K e) σ →
reducible tid e σ.
Lemma pure_stepーcontext (K : expr → expr) `{!Context K} e1 e2 :
pure_step e1 e2 →
pure_step (K e1) (K e2).
Lemma pure_stepーnstepsーcontext (K : expr → expr) `{!Context K} n e1 e2 :
relations.nsteps pure_step n e1 e2 →
relations.nsteps pure_step n (K e1) (K e2).
Lemma pure_execーcontext (K : expr → expr) `{!Context K} ϕ n e1 e2 :
PureExec ϕ n e1 e2 →
PureExec ϕ n (K e1) (K e2).
Lemma pure_execーfill K ϕ n e1 e2 :
PureExec ϕ n e1 e2 →
PureExec ϕ n (fill K e1) (fill K e2).
Lemma sub_redexes_are_valuesーalt e :
( ∀ k e',
e = filli k e' →
is_Some (to_val e')
) →
sub_redexes_are_values e.
Lemma to_valーfillーSome K e v :
to_val (fill K e) = Some v →
K = [] ∧ e = Val v.
Lemma prim_stepーto_valーisーbase_step tid e σ1 κ v σ2 es :
prim_step tid e σ1 κ (Val v) σ2 es →
base_step tid e σ1 κ (Val v) σ2 es.
Lemma silent_stepsーnsteps ρ1 ρ2 :
rtc silent_step ρ1 ρ2 ↔
∃ n κs,
nsteps n ρ1 κs ρ2.
Lemma stepーlength ρ1 κ ρ2 :
step ρ1 κ ρ2 →
length ρ1.1 ≤ length ρ2.1.
Lemma nstepsーlength n ρ1 κs ρ2 :
nsteps n ρ1 κs ρ2 →
length ρ1.1 ≤ length ρ2.1.
Lemma base_reducible_no_obsーequal tid v1 v2 σ :
base_reducible_no_obs tid (Equal (Val v1) (Val v2)) σ.
Lemma base_reducibleーequal tid v1 v2 σ :
base_reducible tid (Equal (Val v1) (Val v2)) σ.
Lemma reducibleーequal tid v1 v2 σ :
reducible tid (Equal (Val v1) (Val v2)) σ.
Lemma base_reducible_no_obsーcas tid l fld v1 v2 v σ :
σ.(state۰heap) !! (l +ₗ fld) = Some v →
base_reducible_no_obs tid (CAS (Val $ ValTuple [ValLoc l; ValInt fld]) (Val v1) (Val v2)) σ.
Lemma base_reducibleーcas tid l fld v1 v2 v σ :
σ.(state۰heap) !! (l +ₗ fld) = Some v →
base_reducible tid (CAS (Val $ ValTuple [ValLoc l; ValInt fld]) (Val v1) (Val v2)) σ.
Lemma reducibleーcas tid l fld v1 v2 v σ :
σ.(state۰heap) !! (l +ₗ fld) = Some v →
reducible tid (CAS (Val $ ValTuple [ValLoc l; ValInt fld]) (Val v1) (Val v2)) σ.
Lemma reducibleーresolve tid e σ pid v :
Atomic e →
reducible tid e σ →
reducible tid (Resolve e (Val $ ValProph pid) (Val v)) σ.
Lemma prim_stepーresolveーinv tid e v1 v2 σ1 κ e2 σ2 es :
Atomic e →
prim_step tid (Resolve e (Val v1) (Val v2)) σ1 κ e2 σ2 es →
base_step tid (Resolve e (Val v1) (Val v2)) σ1 κ e2 σ2 es.