Tealeaves.Examples.JAR.TranslateDemo
From Tealeaves.Examples Require Import Lambda.Confluence.
From Tealeaves.Backends Require Import LN DB.
From Tealeaves.Backends.Adapters Require Import LNtoDB DBtoLN Roundtrips.LNDB.
Import List.ListNotations.
Check LNtokey: lam LN → key.
Check toLN: key → lam nat → option (lam LN).
Check toDB: key → lam LN → option (lam nat).
Definition x: atom := 0.
Definition y: atom := 1.
Definition z: atom := 2.
Definition a: atom := 3.
Definition b: atom := 4.
Module de_bruijn.
Example term1: lam nat := tvar 0.
Example term2: lam nat := app (tvar 0) (tvar 1).
Example term3: lam nat := abs (app (tvar 0) (tvar 1)).
Example term4: lam nat := app (abs (app (tvar 1) (tvar 0))) (app (tvar 1) (tvar 0)).
(* ^ term4 = example from JAR paper *)
Example k: key := [x ; y].
Compute toLN [] term1. (* None *)
Compute toLN k term1. (* Some (tvar (Fr 0)) *)
Compute map (toDB k) (toLN k term1).
Compute toLN k term2.
Compute map (toDB k) (toLN k term1).
Compute toLN k term3.
Compute map (toDB k) (toLN k term3).
Compute toLN k term4.
Compute map (toDB k) (toLN k term4).
End de_bruijn.
Module locally_nameless.
Example term1: lam LN := app (tvar (Bd 0)) (tvar (Fr x)).
Example term2: lam LN := abs (app (tvar (Bd 0)) (tvar (Fr x))).
Example term3: lam LN := abs (app (tvar (Fr z)) (tvar (Fr x))).
Example term4: lam LN :=
abs (app
(abs (abs (app
(tvar (Fr z))
(tvar (Fr x)))))
(app
(tvar (Fr y))
(tvar (Fr a)))).
Import List.ListNotations.
Example k: key := [b; z; a; y; x].
Compute toDB k term1.
Compute map (toLN k) (toDB k term1).
Compute toDB k term2.
Compute map (toLN k) (toDB k term2).
Compute toDB k term3.
Compute map (toLN k) (toDB k term3).
Compute toDB k term4.
Compute map (toLN k) (toDB k term4).
Goal map (toLN k) (toDB k term4) = Some (Some term4).
reflexivity.
Qed.
End locally_nameless.
From Tealeaves.Backends Require Import LN DB.
From Tealeaves.Backends.Adapters Require Import LNtoDB DBtoLN Roundtrips.LNDB.
Import List.ListNotations.
Check LNtokey: lam LN → key.
Check toLN: key → lam nat → option (lam LN).
Check toDB: key → lam LN → option (lam nat).
Definition x: atom := 0.
Definition y: atom := 1.
Definition z: atom := 2.
Definition a: atom := 3.
Definition b: atom := 4.
Module de_bruijn.
Example term1: lam nat := tvar 0.
Example term2: lam nat := app (tvar 0) (tvar 1).
Example term3: lam nat := abs (app (tvar 0) (tvar 1)).
Example term4: lam nat := app (abs (app (tvar 1) (tvar 0))) (app (tvar 1) (tvar 0)).
(* ^ term4 = example from JAR paper *)
Example k: key := [x ; y].
Compute toLN [] term1. (* None *)
Compute toLN k term1. (* Some (tvar (Fr 0)) *)
Compute map (toDB k) (toLN k term1).
Compute toLN k term2.
Compute map (toDB k) (toLN k term1).
Compute toLN k term3.
Compute map (toDB k) (toLN k term3).
Compute toLN k term4.
Compute map (toDB k) (toLN k term4).
End de_bruijn.
Module locally_nameless.
Example term1: lam LN := app (tvar (Bd 0)) (tvar (Fr x)).
Example term2: lam LN := abs (app (tvar (Bd 0)) (tvar (Fr x))).
Example term3: lam LN := abs (app (tvar (Fr z)) (tvar (Fr x))).
Example term4: lam LN :=
abs (app
(abs (abs (app
(tvar (Fr z))
(tvar (Fr x)))))
(app
(tvar (Fr y))
(tvar (Fr a)))).
Import List.ListNotations.
Example k: key := [b; z; a; y; x].
Compute toDB k term1.
Compute map (toLN k) (toDB k term1).
Compute toDB k term2.
Compute map (toLN k) (toDB k term2).
Compute toDB k term3.
Compute map (toLN k) (toDB k term3).
Compute toDB k term4.
Compute map (toLN k) (toDB k term4).
Goal map (toLN k) (toDB k term4) = Some (Some term4).
reflexivity.
Qed.
End locally_nameless.