Module Qcert.tDNNRC.Typing.tDNNRCSub
Require Import String.
Require Import List.
Require Import Arith.
Require Import Program.
Require Import EquivDec.
Require Import Morphisms.
Require Import Utils.
Require Import DataSystem.
Require Import DNNRCSystem.
Require Import tDNNRC.
Section tDNNRCSub.
Context {
m:
basic_model}.
Section typ.
Context (τ
constants:
tdbindings).
Inductive dnnrc_base_type_sub {
A plug_type:
Set}
{
plug:
AlgPlug plug_type} {
tplug:
TAlgPlug} :
tdbindings -> @
dnnrc_base _ A plug_type ->
drtype ->
Prop :=
|
TDNNRCGetConstant {τ
out}
tenv s :
forall (
a:
A),
tdot τ
constants s =
Some τ
out ->
dnnrc_base_type_sub tenv (
DNNRCGetConstant a s) τ
out
|
TDNNRCVar {τ}
tenv v :
forall (
a:
A),
lookup equiv_dec tenv v =
Some τ ->
dnnrc_base_type_sub tenv (
DNNRCVar a v) τ
|
TDNNRCConst {τ}
tenv c :
forall (
a:
A),
data_type (
normalize_data brand_relation_brands c) τ ->
dnnrc_base_type_sub tenv (
DNNRCConst a c) (
Tlocal τ)
|
TDNNRCBinop {τ₁ τ₂ τ}
tenv b e1 e2 :
forall (
a:
A),
binary_op_type b τ₁ τ₂ τ ->
dnnrc_base_type_sub tenv e1 (
Tlocal τ₁) ->
dnnrc_base_type_sub tenv e2 (
Tlocal τ₂) ->
dnnrc_base_type_sub tenv (
DNNRCBinop a b e1 e2) (
Tlocal τ)
|
TDNNRCUnop {τ₁ τ}
tenv u e1 :
forall (
a:
A),
unary_op_type u τ₁ τ ->
dnnrc_base_type_sub tenv e1 (
Tlocal τ₁) ->
dnnrc_base_type_sub tenv (
DNNRCUnop a u e1) (
Tlocal τ)
|
TDNNRCLet {τ₁ τ₂}
v tenv e1 e2 :
forall (
a:
A),
dnnrc_base_type_sub tenv e1 τ₁ ->
dnnrc_base_type_sub ((
v,τ₁)::
tenv)
e2 τ₂ ->
dnnrc_base_type_sub tenv (
DNNRCLet a v e1 e2) τ₂
|
TDNRCForLocal {τ₁ τ₂}
v tenv e1 e2 :
forall (
a:
A),
dnnrc_base_type_sub tenv e1 (
Tlocal (
Coll τ₁)) ->
dnnrc_base_type_sub ((
v,(
Tlocal τ₁))::
tenv)
e2 (
Tlocal τ₂) ->
dnnrc_base_type_sub tenv (
DNNRCFor a v e1 e2) (
Tlocal (
Coll τ₂))
|
TDNRCForDist {τ₁ τ₂}
v tenv e1 e2 :
forall (
a:
A),
dnnrc_base_type_sub tenv e1 (
Tdistr τ₁) ->
dnnrc_base_type_sub ((
v,(
Tlocal τ₁))::
tenv)
e2 (
Tlocal τ₂) ->
dnnrc_base_type_sub tenv (
DNNRCFor a v e1 e2) (
Tdistr τ₂)
|
TDNRCIf {τ}
tenv e1 e2 e3 :
forall (
a:
A),
dnnrc_base_type_sub tenv e1 (
Tlocal Bool) ->
dnnrc_base_type_sub tenv e2 τ ->
dnnrc_base_type_sub tenv e3 τ ->
dnnrc_base_type_sub tenv (
DNNRCIf a e1 e2 e3) τ
|
TDNNRCEither {τ τ
l τ
r}
tenv ed xl el xr er :
forall (
a:
A),
dnnrc_base_type_sub tenv ed (
Tlocal (
Either τ
l τ
r)) ->
dnnrc_base_type_sub ((
xl,(
Tlocal τ
l))::
tenv)
el τ ->
dnnrc_base_type_sub ((
xr,(
Tlocal τ
r))::
tenv)
er τ ->
dnnrc_base_type_sub tenv (
DNNRCEither a ed xl el xr er) τ
|
TDNNRCCollect {τ}
tenv e :
forall (
a:
A),
dnnrc_base_type_sub tenv e (
Tdistr τ) ->
dnnrc_base_type_sub tenv (
DNNRCCollect a e) (
Tlocal (
Coll τ))
|
TDNNRCDispatch {τ}
tenv e :
forall (
a:
A),
dnnrc_base_type_sub tenv e (
Tlocal (
Coll τ)) ->
dnnrc_base_type_sub tenv (
DNNRCDispatch a e) (
Tdistr τ)
|
TDNNRCAlg {τ
out}
tenv tbindings op nl :
forall (
a:
A),
Forall2 (
fun n τ =>
fst n =
fst τ
/\
dnnrc_base_type_sub tenv (
snd n) (
Tdistr (
snd τ)))
nl tbindings ->
plug_typing op tbindings (
Coll τ
out) ->
dnnrc_base_type_sub tenv (
DNNRCAlg a op nl) (
Tdistr τ
out)
|
TDNNRCSubsumption {τ
env τ
out} τ
env' τ
out'
e:
tdbindings_sub τ
env' τ
env ->
drtype_sub τ
out τ
out' ->
dnnrc_base_type_sub τ
env e τ
out ->
dnnrc_base_type_sub τ
env'
e τ
out'
.
Global Instance dnnrc_base_type_sub_proper {
A plug_type:
Set} {
plug:
AlgPlug plug_type} {
tplug:
TAlgPlug} :
Proper (
tdbindings_sub -->
eq ==>
drtype_sub ==>
impl) (
dnnrc_base_type_sub (
A:=
A)).
Proof.
Global Instance dbindings_type_proper :
Proper (
eq ==>
tdbindings_sub ==>
impl)
dbindings_type.
Proof.
unfold Proper,
respectful,
flip,
impl,
tdbindings_sub,
dbindings_type;
intros.
subst.
revert y y0 H0 H1.
induction x0;
intros x y0 F1 F2
;
invcs F1;
invcs F2;
trivial.
destruct a;
destruct y;
destruct x1;
intuition;
simpl in *;
subst.
rewrite H0 in H2.
auto.
Qed.
End typ.
Section lift.
Lemma dnnrc_base_type_to_dnnrc_base_type_sub {
A} (
plug_type:
Set) (
plug:
AlgPlug plug_type) {
tplug:
TAlgPlug} {τ
c} {τ} (
tenv:
tdbindings) (
e:@
dnnrc_base _ A plug_type) :
dnnrc_base_type τ
c tenv e τ ->
dnnrc_base_type_sub τ
c tenv e τ.
Proof.
Local Hint Constructors dnnrc_base_type_sub :
qcert.
revert tenv τ.
induction e;
simpl;
intros tenv τ
dt;
invcs dt;
qeauto.
-
econstructor;
try eassumption.
revert H5.
apply Forall2_incl.
rewrite Forall_forall in H.
intros ? ?
inn1 inn2 [
eqq1 eqq2].
auto.
Qed.
End lift.
End tDNNRCSub.