Tealeaves.Examples.STLC.CompatTest

From Tealeaves Require Export
  Backends.LN
  Examples.STLC.Syntax.

Export LN.Notations.
#[local] Generalizable Variables G.

#[local] Set Implicit Arguments.

Language definition

Inductive term :=
| atm : atom term
| ix : nat term
| lam : typ term term
| app : term term term.

Instantiate Tealeaves

Fixpoint to_T (t: term) : Syntax.Lam LN :=
  match t with
  | atm aSyntax.tvar (Fr a)
  | ix nSyntax.tvar (Bd n)
  | lam τ tSyntax.lam τ (to_T t)
  | app t1 t2Syntax.app (to_T t1) (to_T t2)
  end.

Fixpoint to_T_inv (t: Syntax.Lam LN) : term :=
  match t with
  | tvar (Fr a) ⇒ atm a
  | tvar (Bd n) ⇒ ix n
  | Syntax.lam τ tlam τ (to_T_inv t)
  | Syntax.app t1 t2app (to_T_inv t1) (to_T_inv t2)
  end.

Lemma to_T_iso: (t : term), to_T_inv (to_T t) = t.
Proof.
  intros.
  induction t.
  - reflexivity.
  - reflexivity.
  - cbn. now rewrite IHt.
  - cbn. now rewrite IHt1, IHt2.
Qed.

Lemma to_T_iso_inv: (t : Syntax.Lam LN), to_T (to_T_inv t) = t.
Proof.
  intros.
  induction t.
  - cbn. destruct v; reflexivity.
  - cbn. now rewrite IHt.
  - cbn. now rewrite IHt1, IHt2.
Qed.

Module STLC_SIG <: SyntaxSIG with Definition term := term.

  Definition term : Type := term.
  Definition T := Syntax.Lam.
  Definition ret_inst := Syntax.Return_STLC.
  Definition binddt_inst := Syntax.Binddt_STLC.
  Definition monad_inst := Syntax.DTM_STLC.

  Definition to_T := to_T.
  Definition to_T_inv := to_T_inv.
  Definition to_T_iso := to_T_iso.
  Definition to_T_iso_inv := to_T_iso_inv.

  Definition from_atom := atm.
  Definition from_ix := ix.

  Definition from_atom_Ret:
    from_atom = to_T_inv @ret T ret_inst LN Fr :=
    ltac:(reflexivity).
  Definition from_ix_Ret:
    from_ix = to_T_inv @ret T ret_inst LN Bd :=
    ltac:(reflexivity).

End STLC_SIG.

Module Theory <: TheorySIG
  := MakeTheory STLC_SIG.
Import Theory.
(*
Import Theory.Notations.
*)