NNRS is a variant of the named nested relational calculus
(NNRC) that is meant to be more imperative in feel. It is used
as an intermediate language between NNRC and more imperative /
statement oriented backends
Require Import String.
Require Import List.
Require Import Arith.
Require Import EquivDec.
Require Import Morphisms.
Require Import Arith.
Require Import Max.
Require Import Bool.
Require Import Peano_dec.
Require Import EquivDec.
Require Import Decidable.
Require Import Utils.
Require Import DataRuntime.
Require Import NNRS.
Section NNRSSem.
Context {
fruntime:
foreign_runtime}.
Context (
h:
brand_relation_t).
Local Open Scope nnrs.
Local Open Scope string.
Section Denotation.
Context (σ
c:
list (
string*
data)).
Reserved Notation "[ σ ⊢
e ⇓
d ]".
Inductive nnrs_expr_sem :
pd_bindings ->
nnrs_expr ->
data ->
Prop :=
|
sem_NNRSGetConstant :
forall v σ
d,
edot σ
c v =
Some d ->
(* Γc(v) = d *)
[ σ ⊢
NNRSGetConstant v ⇓
d ]
|
sem_NNRSVar :
forall v σ
d,
lookup equiv_dec σ
v =
Some (
Some d) ->
(* Γ(v) = d *)
[ σ ⊢
NNRSVar v ⇓
d ]
|
sem_NNRSConst :
forall d₁ σ
d₂,
normalize_data h d₁ =
d₂ ->
(* norm(d₁) = d₂ *)
[ σ ⊢
NNRSConst d₁ ⇓
d₂ ]
|
sem_NNRSBinop :
forall bop e₁
e₂ σ
d₁
d₂
d,
[ σ ⊢
e₁ ⇓
d₁ ] ->
[ σ ⊢
e₂ ⇓
d₂ ] ->
binary_op_eval h bop d₁
d₂ =
Some d ->
[ σ ⊢
NNRSBinop bop e₁
e₂ ⇓
d ]
|
sem_NNRSUnop :
forall uop e σ
d₁
d,
[ σ ⊢
e ⇓
d₁ ] ->
unary_op_eval h uop d₁ =
Some d ->
[ σ ⊢
NNRSUnop uop e ⇓
d ]
|
sem_NNRSGroupBy :
forall g sl e σ
d₁
d₂ ,
[ σ ⊢
e ⇓ (
dcoll d₁) ] ->
group_by_nested_eval_table g sl d₁ =
Some d₂ ->
[ σ ⊢
NNRSGroupBy g sl e ⇓ (
dcoll d₂) ]
where
"[ σ ⊢
e ⇓
d ]" := (
nnrs_expr_sem σ
e d) :
nnrs_scope
.
Reserved Notation "[
s₁ , σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ]".
Reserved Notation "[
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v <-
dl ] σ₂ , ψ
c₂ , ψ
d₂ ]".
Inductive nnrs_stmt_sem :
nnrs_stmt ->
pd_bindings ->
mc_bindings ->
md_bindings ->
pd_bindings ->
mc_bindings ->
md_bindings ->
Prop :=
|
sem_NNRSSeq s₁
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ σ₃ ψ
c₃ ψ
d₃ :
[
s₁, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ] ->
[
s₂, σ₂ , ψ
c₂ , ψ
d₂ ⇓ σ₃ , ψ
c₃, ψ
d₃ ] ->
[
NNRSSeq s₁
s₂, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₃ , ψ
c₃, ψ
d₃ ]
|
sem_NNRSLet v e s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
d dd :
[ σ₁ ⊢
e ⇓
d ] ->
[
s, (
v,
Some d)::σ₁, ψ
c₁ , ψ
d₁ ⇓ (
v,
dd)::σ₂ , ψ
c₂ , ψ
d₂ ] ->
[
NNRSLet v e s, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ]
|
sem_NNRSLetMut v s₁
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ σ₃ ψ
c₃ ψ
d₃
d dd :
[
s₁, σ₁ , ψ
c₁ , (
v,
None)::ψ
d₁ ⇓ σ₂ , ψ
c₂ , (
v,
d)::ψ
d₂ ] ->
[
s₂, (
v,
d)::σ₂ , ψ
c₂ , ψ
d₂ ⇓ (
v,
dd)::σ₃ , ψ
c₃, ψ
d₃ ] ->
[
NNRSLetMut v s₁
s₂, σ₁,ψ
c₁, ψ
d₁ ⇓ σ₃ , ψ
c₃, ψ
d₃ ]
|
sem_NNRSLetMutColl v s₁
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ σ₃ ψ
c₃ ψ
d₃
d dd :
[
s₁, σ₁ , (
v,
nil)::ψ
c₁ , ψ
d₁ ⇓ σ₂ , (
v,
d)::ψ
c₂ , ψ
d₂ ] ->
[
s₂, (
v,
Some (
dcoll d))::σ₂ , ψ
c₂ , ψ
d₂ ⇓ (
v,
dd)::σ₃ , ψ
c₃, ψ
d₃ ] ->
[
NNRSLetMutColl v s₁
s₂, σ₁,ψ
c₁, ψ
d₁ ⇓ σ₃ , ψ
c₃, ψ
d₃ ]
|
sem_NNRSAssign v e σ ψ
c ψ
d dold d :
lookup string_dec ψ
d v =
Some dold ->
[ σ ⊢
e ⇓
d ] ->
[
NNRSAssign v e, σ , ψ
c , ψ
d ⇓ σ, ψ
c,
update_first string_dec ψ
d v (
Some d)]
|
sem_NNRSPush v e σ ψ
c ψ
d mc d :
lookup string_dec ψ
c v =
Some mc ->
[ σ ⊢
e ⇓
d ] ->
[
NNRSPush v e, σ , ψ
c , ψ
d ⇓ σ ,
update_first string_dec ψ
c v (
mc++
d::
nil)%
list, ψ
d]
|
sem_NNRSFor v e s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
dl :
[ σ₁ ⊢
e ⇓ (
dcoll dl) ] ->
[
s, σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v<-
dl] σ₂, ψ
c₂ , ψ
d₂] ->
[
NNRSFor v e s, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂]
|
sem_NNRSIfTrue e s₁
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ :
[ σ₁ ⊢
e ⇓ (
dbool true) ] ->
[
s₁, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂] ->
[
NNRSIf e s₁
s₂, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂]
|
sem_NNRSIfFalse e s₁
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ :
[ σ₁ ⊢
e ⇓ (
dbool false) ] ->
[
s₂, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂] ->
[
NNRSIf e s₁
s₂, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂]
|
sem_NNRSEitherLeft e x₁
s₁
x₂
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
d dd :
[ σ₁ ⊢
e ⇓ (
dleft d) ] ->
[
s₁, (
x₁,
Some d)::σ₁ , ψ
c₁ , ψ
d₁ ⇓ (
x₁,
dd)::σ₂, ψ
c₂ , ψ
d₂] ->
[
NNRSEither e x₁
s₁
x₂
s₂, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂]
|
sem_NNRSEitherRight e x₁
s₁
x₂
s₂ σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
d dd :
[ σ₁ ⊢
e ⇓ (
dright d) ] ->
[
s₂, (
x₂,
Some d)::σ₁ , ψ
c₁ , ψ
d₁ ⇓ (
x₂,
dd)::σ₂, ψ
c₂ , ψ
d₂] ->
[
NNRSEither e x₁
s₁
x₂
s₂, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂, ψ
c₂ , ψ
d₂]
with nnrs_stmt_sem_iter:
var ->
list data ->
nnrs_stmt ->
pd_bindings ->
mc_bindings ->
md_bindings ->
pd_bindings ->
mc_bindings ->
md_bindings ->
Prop :=
|
sem_NNRSIter_nil v s σ ψ
c ψ
d :
[
s, σ , ψ
c, ψ
d ⇓[
v<-
nil] σ, ψ
c, ψ
d]
|
sem_NNRSIter_cons v s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ σ₃ ψ
c₃ ψ
d₃
d dl dd:
[
s, (
v,
Some d)::σ₁, ψ
c₁ , ψ
d₁ ⇓ (
v,
dd)::σ₂, ψ
c₂ , ψ
d₂] ->
[
s, σ₂ , ψ
c₂ , ψ
d₂ ⇓[
v<-
dl] σ₃, ψ
c₃, ψ
d₃] ->
[
s, σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v<-
d::
dl] σ₃, ψ
c₃, ψ
d₃]
where
"[
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope
and "[
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v <-
dl ] σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem_iter v dl s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
Notation "[
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
Notation "[
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v <-
dl ] σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem_iter v dl s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
End Denotation.
Reserved Notation "[ σ
c ⊢
q ⇓
d ]".
Notation "[ σ
c ; σ ⊢
e ⇓
d ]" := (
nnrs_expr_sem σ
c σ
e d) :
nnrs_scope.
Notation "[ σ
c ⊢
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem σ
c s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
Notation "[ σ
c ⊢
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v <-
dl ] σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem_iter σ
c v dl s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
Inductive nnrs_sem :
bindings ->
nnrs ->
option data ->
Prop
:=
|
sem_NNRS (σ
c:
bindings) (
q:
nnrs)
o :
[ σ
c ⊢ (
fst q),
nil ,
nil, ((
snd q),
None)::
nil ⇓
nil,
nil, ((
snd q),
o)::
nil ] ->
[ σ
c ⊢
q ⇓
o ]
where
"[ σ
c ⊢
q ⇓
o ]" := (
nnrs_sem σ
c q o ) :
nnrs_scope.
Definition nnrs_sem_top (σ
c:
bindings) (
q:
nnrs) (
d:
data) :
Prop
:= [ (
rec_sort σ
c) ⊢
q ⇓
Some d ].
Notation "[ σ
c ⊢
q ⇓
d ]" := (
nnrs_sem σ
c q d ) :
nnrs_scope.
Section Core.
Program Definition nnrs_core_sem σ
c (
q:
nnrs_core) (
d:
option data) :
Prop
:=
nnrs_sem σ
c q d.
Notation "[ σ
c ⊢
q ⇓ᶜ
d ]" := (
nnrs_core_sem σ
c q d ) :
nnrs_scope.
Definition nnrs_core_sem_top (σ
c:
bindings) (
q:
nnrs_core) (
d:
data) :
Prop
:= [ (
rec_sort σ
c) ⊢
q ⇓ᶜ
Some d ].
End Core.
Section props.
Context (σ
c:
list (
string*
data)).
Lemma nnrs_stmt_sem_env_stack {
s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂}:
[ σ
c ⊢
s, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ] ->
domain σ₁ =
domain σ₂.
Proof.
revert σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂.
nnrs_stmt_cases (
induction s)
Case;
intros σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
sem;
invcs sem.
-
Case "
NNRSSeq".
transitivity (
domain σ₂0);
eauto.
-
Case "
NNRSLet".
specialize (
IHs _ _ _ _ _ _ H9).
simpl in IHs;
invcs IHs.
trivial.
-
Case "
NNRSLetMut".
specialize (
IHs1 _ _ _ _ _ _ H8).
specialize (
IHs2 _ _ _ _ _ _ H9).
simpl in IHs2;
invcs IHs2.
congruence.
-
Case "
NNRSLetMutColl".
specialize (
IHs1 _ _ _ _ _ _ H8).
specialize (
IHs2 _ _ _ _ _ _ H9).
simpl in IHs2;
invcs IHs2.
congruence.
-
Case "
NNRSAssign".
trivial.
-
Case "
NNRSPush".
trivial.
-
Case "
NNRSFor".
clear H8.
revert σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
H9.
induction dl;
intros σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
sem;
invcs sem;
trivial.
specialize (
IHdl _ _ _ _ _ _ H10).
specialize (
IHs _ _ _ _ _ _ H2).
simpl in IHs;
invcs IHs.
congruence.
-
Case "
NNRSIf".
eauto.
-
Case "
NNRSIf".
eauto.
-
Case "
NNRSEither".
specialize (
IHs1 _ _ _ _ _ _ H11).
simpl in IHs1;
invcs IHs1;
trivial.
-
Case "
NNRSEither".
specialize (
IHs2 _ _ _ _ _ _ H11).
simpl in IHs2;
invcs IHs2;
trivial.
Qed.
Lemma nnrs_stmt_sem_mcenv_stack {
s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂}:
[ σ
c ⊢
s, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ] ->
domain ψ
c₁ =
domain ψ
c₂.
Proof.
revert σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂.
nnrs_stmt_cases (
induction s)
Case;
intros σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
sem;
invcs sem.
-
Case "
NNRSSeq".
transitivity (
domain ψ
c₂0);
eauto.
-
Case "
NNRSLet".
specialize (
IHs _ _ _ _ _ _ H9).
simpl in IHs;
invcs IHs.
trivial.
-
Case "
NNRSLetMut".
specialize (
IHs1 _ _ _ _ _ _ H8).
specialize (
IHs2 _ _ _ _ _ _ H9).
simpl in IHs2;
invcs IHs2.
congruence.
-
Case "
NNRSLetMutColl".
specialize (
IHs1 _ _ _ _ _ _ H8).
specialize (
IHs2 _ _ _ _ _ _ H9).
simpl in IHs1;
invcs IHs1.
congruence.
-
Case "
NNRSAssign".
trivial.
-
Case "
NNRSPush".
rewrite domain_update_first;
trivial.
-
Case "
NNRSFor".
clear H8.
revert σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
H9.
induction dl;
intros σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
sem;
invcs sem;
trivial.
specialize (
IHdl _ _ _ _ _ _ H10).
specialize (
IHs _ _ _ _ _ _ H2).
simpl in IHs;
invcs IHs.
congruence.
-
Case "
NNRSIf".
eauto.
-
Case "
NNRSIf".
eauto.
-
Case "
NNRSEither".
specialize (
IHs1 _ _ _ _ _ _ H11).
simpl in IHs1;
invcs IHs1;
trivial.
-
Case "
NNRSEither".
specialize (
IHs2 _ _ _ _ _ _ H11).
simpl in IHs2;
invcs IHs2;
trivial.
Qed.
Lemma nnrs_stmt_sem_mdenv_stack {
s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂}:
[ σ
c ⊢
s, σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ] ->
domain ψ
d₁ =
domain ψ
d₂.
Proof.
revert σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂.
nnrs_stmt_cases (
induction s)
Case;
intros σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
sem;
invcs sem.
-
Case "
NNRSSeq".
transitivity (
domain ψ
d₂0);
eauto.
-
Case "
NNRSLet".
specialize (
IHs _ _ _ _ _ _ H9).
simpl in IHs;
invcs IHs.
trivial.
-
Case "
NNRSLetMut".
specialize (
IHs1 _ _ _ _ _ _ H8).
specialize (
IHs2 _ _ _ _ _ _ H9).
simpl in IHs1;
invcs IHs1.
congruence.
-
Case "
NNRSLetMutColl".
specialize (
IHs1 _ _ _ _ _ _ H8).
specialize (
IHs2 _ _ _ _ _ _ H9).
simpl in IHs1;
invcs IHs1.
congruence.
-
Case "
NNRSAssign".
rewrite domain_update_first;
trivial.
-
Case "
NNRSPush".
trivial.
-
Case "
NNRSFor".
clear H8.
revert σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
H9.
induction dl;
intros σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂
sem;
invcs sem;
trivial.
specialize (
IHdl _ _ _ _ _ _ H10).
specialize (
IHs _ _ _ _ _ _ H2).
simpl in IHs;
invcs IHs.
congruence.
-
Case "
NNRSIf".
eauto.
-
Case "
NNRSIf".
eauto.
-
Case "
NNRSEither".
specialize (
IHs1 _ _ _ _ _ _ H11).
simpl in IHs1;
invcs IHs1;
trivial.
-
Case "
NNRSEither".
specialize (
IHs2 _ _ _ _ _ _ H11).
simpl in IHs2;
invcs IHs2;
trivial.
Qed.
Lemma nnrs_stmt_sem_env_cons_same
{
s v₁
od₁ σ₁ ψ
c₁ ψ
d₁
v₂
od₂ σ₂ ψ
c₂ ψ
d₂} :
[ σ
c ⊢
s, (
v₁,
od₁) :: σ₁, ψ
c₁ , ψ
d₁ ⇓ (
v₂,
od₂) :: σ₂, ψ
c₂ , ψ
d₂] ->
[ σ
c ⊢
s, (
v₁,
od₁) :: σ₁, ψ
c₁ , ψ
d₁ ⇓ (
v₁,
od₂) :: σ₂, ψ
c₂ , ψ
d₂].
Proof.
Lemma nnrs_stmt_sem_mcenv_cons_same
{
s v₁
od₁ σ₁ ψ
c₁ ψ
d₁
v₂
od₂ σ₂ ψ
c₂ ψ
d₂} :
[ σ
c ⊢
s, σ₁, (
v₁,
od₁)::ψ
c₁ , ψ
d₁ ⇓ σ₂, (
v₂,
od₂) :: ψ
c₂ , ψ
d₂] ->
[ σ
c ⊢
s, σ₁, (
v₁,
od₁)::ψ
c₁ , ψ
d₁ ⇓ σ₂, (
v₁,
od₂)::ψ
c₂ , ψ
d₂].
Proof.
Lemma nnrs_stmt_sem_mdenv_cons_same
{
s v₁
od₁ σ₁ ψ
c₁ ψ
d₁
v₂
od₂ σ₂ ψ
c₂ ψ
d₂} :
[ σ
c ⊢
s, σ₁, ψ
c₁ , (
v₁,
od₁)::ψ
d₁ ⇓ σ₂, ψ
c₂ , (
v₂,
od₂) :: ψ
d₂] ->
[ σ
c ⊢
s, σ₁, ψ
c₁ , (
v₁,
od₁)::ψ
d₁ ⇓ σ₂, ψ
c₂ , (
v₁,
od₂)::ψ
d₂].
Proof.
End props.
End NNRSSem.
Notation "[
h , σ
c ; σ ⊢
e ⇓
d ]" := (
nnrs_expr_sem h σ
c σ
e d) :
nnrs_scope.
Notation "[
h , σ
c ⊢
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓ σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem h σ
c s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
Notation "[
h , σ
c ⊢
s , σ₁ , ψ
c₁ , ψ
d₁ ⇓[
v <-
dl ] σ₂ , ψ
c₂ , ψ
d₂ ]" := (
nnrs_stmt_sem_iter h σ
c v dl s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂ ) :
nnrs_scope.
Notation "[
h , σ
c ⊢
q ⇓
d ]" := (
nnrs_sem h σ
c q d ) :
nnrs_scope.
Notation "[
h , σ
c ⊢
q ⇓ᶜ
d ]" := (
nnrs_core_sem h σ
c q d ) :
nnrs_scope.
Arguments nnrs_stmt_sem_env_stack {
fruntime h σ
c s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂}.
Arguments nnrs_stmt_sem_mcenv_stack {
fruntime h σ
c s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂}.
Arguments nnrs_stmt_sem_mdenv_stack {
fruntime h σ
c s σ₁ ψ
c₁ ψ
d₁ σ₂ ψ
c₂ ψ
d₂}.
Arguments nnrs_stmt_sem_env_cons_same {
fruntime h σ
c s v₁
od₁ σ₁ ψ
c₁ ψ
d₁
v₂
od₂ σ₂ ψ
c₂ ψ
d₂}.
Arguments nnrs_stmt_sem_mcenv_cons_same {
fruntime h σ
c s v₁
od₁ σ₁ ψ
c₁ ψ
d₁
v₂
od₂ σ₂ ψ
c₂ ψ
d₂}.
Arguments nnrs_stmt_sem_mdenv_cons_same {
fruntime h σ
c s v₁
od₁ σ₁ ψ
c₁ ψ
d₁
v₂
od₂ σ₂ ψ
c₂ ψ
d₂}.