Qcert.NRAEnv.Core.cNRAEnvIgnore


Section cNRAEnvIgnore.




Some infrastructure for rewrites

  Context {fruntime:foreign_runtime}.

  Fixpoint cnraenv_is_nra (e:cnraenv) : Prop :=
    match e with
      | ANIDTrue
      | ANConst rdTrue
      | ANBinop bop e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANUnop uop e1cnraenv_is_nra e1
      | ANMap e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANMapConcat e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANProduct e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANSelect e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANDefault e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANEither e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANEitherConcat e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANApp e1 e2(cnraenv_is_nra e1) (cnraenv_is_nra e2)
      | ANGetConstant _False
      | ANEnvFalse
      | ANAppEnv e1 e2False
      | ANMapEnv e1False
    end.

  Fixpoint cnraenv_is_nra_fun (e:cnraenv) : bool :=
    match e with
      | ANIDtrue
      | ANConst rdtrue
      | ANBinop bop e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANUnop uop e1cnraenv_is_nra_fun e1
      | ANMap e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANMapConcat e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANProduct e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANSelect e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANDefault e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANEither e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANEitherConcat e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANApp e1 e2andb (cnraenv_is_nra_fun e1) (cnraenv_is_nra_fun e2)
      | ANGetConstant _false
      | ANEnvfalse
      | ANAppEnv e1 e2false
      | ANMapEnv e1false
    end.

  Lemma cnraenv_is_nra_eq (e:cnraenv):
    cnraenv_is_nra e (cnraenv_is_nra_fun e = true).

  Fixpoint cnraenv_ignores_env (e:cnraenv) : Prop :=
    match e with
      | ANIDTrue
      | ANConst rdTrue
      | ANBinop bop e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANUnop uop e1cnraenv_ignores_env e1
      | ANMap e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANMapConcat e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANProduct e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANSelect e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANDefault e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANEither e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANEitherConcat e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANApp e1 e2(cnraenv_ignores_env e1) (cnraenv_ignores_env e2)
      | ANGetConstant _True
      | ANEnvFalse
      | ANAppEnv e1 e2 ⇒ (cnraenv_ignores_env e2)
      | ANMapEnv e1False
    end.

  Fixpoint cnraenv_ignores_env_fun (e:cnraenv) : bool :=
    match e with
      | ANIDtrue
      | ANConst rdtrue
      | ANBinop bop e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANUnop uop e1cnraenv_ignores_env_fun e1
      | ANMap e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANMapConcat e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANProduct e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANSelect e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANDefault e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANEither e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANEitherConcat e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANApp e1 e2andb (cnraenv_ignores_env_fun e1) (cnraenv_ignores_env_fun e2)
      | ANGetConstant _true
      | ANEnvfalse
      | ANAppEnv e1 e2 ⇒ (cnraenv_ignores_env_fun e2)
      | ANMapEnv e1false
    end.

  Lemma cnraenv_ignores_env_eq (e:cnraenv):
    cnraenv_ignores_env e (cnraenv_ignores_env_fun e = true).


  Fixpoint cnraenv_fixed_env (e:cnraenv) : Prop :=
    match e with
      | ANIDTrue
      | ANConst rdTrue
      | ANBinop bop e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANUnop uop e1cnraenv_fixed_env e1
      | ANMap e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANMapConcat e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANProduct e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANSelect e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANDefault e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANEither e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANEitherConcat e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANApp e1 e2(cnraenv_fixed_env e1) (cnraenv_fixed_env e2)
      | ANGetConstant _True
      | ANEnvTrue
      | ANAppEnv e1 e2False
      | ANMapEnv e1False
    end.

  Fixpoint cnraenv_fixed_env_fun (e:cnraenv) : bool :=
    match e with
      | ANIDtrue
      | ANConst rdtrue
      | ANBinop bop e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANUnop uop e1cnraenv_fixed_env_fun e1
      | ANMap e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANMapConcat e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANProduct e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANSelect e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANDefault e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANEither e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANEitherConcat e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANApp e1 e2andb (cnraenv_fixed_env_fun e1) (cnraenv_fixed_env_fun e2)
      | ANGetConstant _true
      | ANEnvtrue
      | ANAppEnv e1 e2false
      | ANMapEnv e1false
    end.

  Lemma cnraenv_fixed_env_eq (e:cnraenv):
    cnraenv_fixed_env e (cnraenv_fixed_env_fun e = true).


  Fixpoint cnraenv_ignores_id (e:cnraenv) : Prop :=
    match e with
      | ANIDFalse
      | ANConst rdTrue
      | ANBinop bop e1 e2(cnraenv_ignores_id e1) (cnraenv_ignores_id e2)
      | ANUnop uop e1cnraenv_ignores_id e1
      | ANMap e1 e2cnraenv_ignores_id e2
      | ANMapConcat e1 e2cnraenv_ignores_id e2
      | ANProduct e1 e2(cnraenv_ignores_id e1) (cnraenv_ignores_id e2)
      | ANSelect e1 e2 ⇒ (cnraenv_ignores_id e2)
      | ANDefault e1 e2(cnraenv_ignores_id e1) (cnraenv_ignores_id e2)
      | ANEither e1 e2False
      | ANEitherConcat e1 e2(cnraenv_ignores_id e1) (cnraenv_ignores_id e2)
      | ANApp e1 e2 ⇒ (cnraenv_ignores_id e2)
      | ANGetConstant _True
      | ANEnvTrue
      | ANAppEnv e1 e2(cnraenv_ignores_id e1) (cnraenv_ignores_id e2)
      | ANMapEnv e1 ⇒ (cnraenv_ignores_id e1)
    end.

  Fixpoint cnraenv_ignores_id_fun (e:cnraenv) : bool :=
    match e with
      | ANIDfalse
      | ANConst rdtrue
      | ANBinop bop e1 e2andb (cnraenv_ignores_id_fun e1) (cnraenv_ignores_id_fun e2)
      | ANUnop uop e1cnraenv_ignores_id_fun e1
      | ANMap e1 e2cnraenv_ignores_id_fun e2
      | ANMapConcat e1 e2cnraenv_ignores_id_fun e2
      | ANProduct e1 e2andb (cnraenv_ignores_id_fun e1) (cnraenv_ignores_id_fun e2)
      | ANSelect e1 e2 ⇒ (cnraenv_ignores_id_fun e2)
      | ANDefault e1 e2andb (cnraenv_ignores_id_fun e1) (cnraenv_ignores_id_fun e2)
      | ANEither e1 e2false
      | ANEitherConcat e1 e2andb (cnraenv_ignores_id_fun e1) (cnraenv_ignores_id_fun e2)
      | ANApp e1 e2 ⇒ (cnraenv_ignores_id_fun e2)
      | ANGetConstant _true
      | ANEnvtrue
      | ANAppEnv e1 e2andb (cnraenv_ignores_id_fun e1) (cnraenv_ignores_id_fun e2)
      | ANMapEnv e1 ⇒ (cnraenv_ignores_id_fun e1)
    end.

  Lemma cnraenv_ignores_id_eq (e:cnraenv):
    cnraenv_ignores_id e (cnraenv_ignores_id_fun e = true).

  Fixpoint cnraenv_deenv_nra (ae:cnraenv) : nra :=
    match ae with
      | ANIDAID
      | ANConst dAConst d
      | ANBinop b ae1 ae2ABinop b (cnraenv_deenv_nra ae1) (cnraenv_deenv_nra ae2)
      | ANUnop u ae1AUnop u (cnraenv_deenv_nra ae1)
      | ANMap ea1 ea2AMap (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANMapConcat ea1 ea2AMapConcat (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANProduct ea1 ea2AProduct (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANSelect ea1 ea2ASelect (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANDefault ea1 ea2ADefault (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANEither ea1 ea2AEither (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANEitherConcat ea1 ea2AEitherConcat (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANApp ea1 ea2AApp (cnraenv_deenv_nra ea1) (cnraenv_deenv_nra ea2)
      | ANGetConstant _AID
      | ANEnvAID
      | ANAppEnv ea1 ea2AID
      | ANMapEnv ea1AID
    end.

  Lemma cnraenv_ignores_env_swap (e:cnraenv) :
    cnraenv_ignores_env e (h:list (string×string)) c,
                                (env1 env2:data), x:data,
                       h ⊢ₑ e @ₑ x c;env1 = h ⊢ₑ e @ₑ x c;env2.

  Lemma cnraenv_ignores_id_swap (e:cnraenv) :
    cnraenv_ignores_id e h:list (string×string), c,
       env:data, x1 x2:data,
          h ⊢ₑ e @ₑ x1 c;env = h ⊢ₑ e @ₑ x2 c;env.

  Lemma cnraenv_is_nra_deenv (h:list (string×string)) c (e:cnraenv) (d1 d2:data) :
    cnraenv_is_nra e
        h (nra_of_cnraenv e) @ₐ (pat_context_data c d1 d2) =
        h (cnraenv_deenv_nra e) @ₐ d2.

  Fixpoint cnraenv_of_nra (a:nra) : cnraenv :=
    match a with
      | AIDANID
      | AConst dANConst d
      | ABinop b e1 e2ANBinop b (cnraenv_of_nra e1) (cnraenv_of_nra e2)
      | AUnop u e1ANUnop u (cnraenv_of_nra e1)
      | AMap e1 e2ANMap (cnraenv_of_nra e1) (cnraenv_of_nra e2)
      | AMapConcat e1 e2ANMapConcat (cnraenv_of_nra e1) (cnraenv_of_nra e2)
      | AProduct e1 e2ANProduct (cnraenv_of_nra e1) (cnraenv_of_nra e2)
      | ASelect e1 e2ANSelect (cnraenv_of_nra e1) (cnraenv_of_nra e2)
      | ADefault e1 e2ANDefault (cnraenv_of_nra e1) (cnraenv_of_nra e2)
      | AEither opl oprANEither (cnraenv_of_nra opl) (cnraenv_of_nra opr)
      | AEitherConcat op1 op2ANEitherConcat (cnraenv_of_nra op1) (cnraenv_of_nra op2)
      | AApp e1 e2ANApp (cnraenv_of_nra e1) (cnraenv_of_nra e2)
    end.

  Lemma cnraenv_eval_of_nra h c e d env :
    nra_eval h e d = cnraenv_eval h c (cnraenv_of_nra e) env d.

  Lemma cnraenv_of_nra_is_nra x : cnraenv_is_nra (cnraenv_of_nra x).

  Lemma cnraenv_deenv_nra_of_nra x : cnraenv_deenv_nra (cnraenv_of_nra x) = x.

End cNRAEnvIgnore.