aboutsummaryrefslogtreecommitdiff
path: root/src/Compilers/InterpByIso.v
blob: a2263364b819e7d2393429e5dc403945739a06d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(** * PHOAS interpretation function for any retract of [var:=interp_base_type] *)
Require Import Crypto.Compilers.Syntax.
Require Import Crypto.Compilers.ExprInversion.
Require Import Crypto.Compilers.SmartMap.

Section language.
  Context {base_type_code : Type}
          {op : flat_type base_type_code -> flat_type base_type_code -> Type}
          {interp_base_type : base_type_code -> Type}
          (interp_op : forall src dst, op src dst -> interp_flat_type interp_base_type src -> interp_flat_type interp_base_type dst)
          {var : base_type_code -> Type}
          (var_of_interp : forall t, interp_base_type t -> var t)
          (interp_of_var : forall t, var t -> interp_base_type t)
          (var_is_retract : forall t x, interp_of_var t (var_of_interp t x) = x).

  Fixpoint interpf_retr {t} (e : @exprf base_type_code op var t)
    : interp_flat_type interp_base_type t
    := match e in exprf _ _ t return interp_flat_type interp_base_type t with
       | TT => tt
       | Var t v => interp_of_var _ v
       | Op t1 tR opc args => interp_op _ _ opc (@interpf_retr _ args)
       | LetIn tx ex tC eC
         => let ev := @interpf_retr _ ex in
            @interpf_retr _ (eC (SmartVarfMap var_of_interp ev))
       | Pair tx ex ty ey => (@interpf_retr _ ex, @interpf_retr _ ey)
       end.

  Definition interp_retr {t} (e : @expr base_type_code op var t)
    : interp_type interp_base_type t
    := fun x => interpf_retr (invert_Abs e (SmartVarfMap var_of_interp x)).
End language.

Global Arguments interp_retr _ _ _ _ _ _ _ _ !_ / _ .