Qcert.Translation.LambdaNRAtoNRAEnv




Section LambdaNRAtoNRAEnv.


  Context {fruntime:foreign_runtime}.

  Fixpoint nraenv_of_lnra (op:lnra) : nraenv :=
    match op with
    | LNRAVar xNRAEnvUnop (ADot x) NRAEnvEnv
    | LNRATable xNRAEnvGetConstant x
    | LNRAConst dNRAEnvConst d
    | LNRABinop b op1 op2NRAEnvBinop b (nraenv_of_lnra op1) (nraenv_of_lnra op2)
    | LNRAUnop u op1NRAEnvUnop u (nraenv_of_lnra op1)
    | LNRAMap lop1 op2NRAEnvMap (nraenv_of_lnra_lambda lop1) (nraenv_of_lnra op2)
    | LNRAMapConcat lop1 op2NRAEnvMapConcat (nraenv_of_lnra_lambda lop1) (nraenv_of_lnra op2)
    | LNRAProduct op1 op2NRAEnvProduct (nraenv_of_lnra op1) (nraenv_of_lnra op2)
    | LNRAFilter lop1 op2NRAEnvSelect (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.