Qcert.Translation.LambdaNRAtoNRAEnv




Section LambdaNRAtoNRAEnv.


  Context {fruntime:foreign_runtime}.

  Fixpoint nraenv_of_lnra (op:lnra) : nraenv :=
    match op with
    | LNRAVar x ⇒ NRAEnvUnop (ADot x) NRAEnvEnv
    | LNRATable x ⇒ NRAEnvGetConstant x
    | LNRAConst d ⇒ NRAEnvConst d
    | LNRABinop b op1 op2 ⇒ NRAEnvBinop b (nraenv_of_lnra op1) (nraenv_of_lnra op2)
    | LNRAUnop u op1 ⇒ NRAEnvUnop u (nraenv_of_lnra op1)
    | LNRAMap lop1 op2 ⇒ NRAEnvMap (nraenv_of_lnra_lambda lop1) (nraenv_of_lnra op2)
    | LNRAMapConcat lop1 op2 ⇒ NRAEnvMapConcat (nraenv_of_lnra_lambda lop1) (nraenv_of_lnra op2)
    | LNRAProduct op1 op2 ⇒ NRAEnvProduct (nraenv_of_lnra op1) (nraenv_of_lnra op2)
    | LNRAFilter lop1 op2 ⇒ NRAEnvSelect (nraenv_of_lnra_lambda lop1) (nraenv_of_lnra op2)
    end
  with nraenv_of_lnra_lambda (lop:lnra_lambda) : nraenv :=
    match lop with
    | LNRALambda x op ⇒
      NRAEnvAppEnv (nraenv_of_lnra op) (NRAEnvBinop AConcat NRAEnvEnv (NRAEnvUnop (ARec x) NRAEnvID))
    end.

  Context (h:brand_relation_t).
  Context (global_env:list (string×data)).

  Theorem nraenv_of_lnra_lambda_correct :
    ∀ env:bindings, ∀ lop:lnra_lambda, ∀ d:data,
      lnra_lambda_eval h global_env env lop d =
      nraenv_eval h global_env
                  (nraenv_of_lnra_lambda lop) (drec env) d.

  Definition eval_nraenv_q (Qe:nraenv) (input:data) : option data :=
    nraenv_eval h global_env Qe (drec nil) input.

  Theorem eval_nraenv_q_correct (Q:lnra → lnra) (input:data) :
    eval_q h global_env Q input = eval_nraenv_q (nraenv_of_lnra_lambda (q_to_lambda Q)) input.

End LambdaNRAtoNRAEnv.