Built with Alectryon, running Coq+SerAPI v8.16.0+0.16.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑ Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use instead of Ctrl.
From Tealeaves Require Export
  Examples.STLC.Syntax
  Backends.DB.

Import STLC.Syntax.TermNotations.
Import DB.Simplification.
Import DB.AutosubstShim.Notations.

(** * Simplification Tests for the De Bruijn Backend *)
(**********************************************************************)

(** ** Rewriting Lemmas for <<rename>> *)
(**********************************************************************)
Section rename.

  Context (ρ: nat -> nat).

  
ρ: nat -> nat

forall n : nat, rename ρ (tvar n : Lam nat) = tvar (ρ n)
ρ: nat -> nat

forall n : nat, rename ρ (tvar n : Lam nat) = tvar (ρ n)
ρ: nat -> nat
n: nat

rename ρ (tvar n : Lam nat) = tvar (ρ n)
ρ: nat -> nat
n: nat

ret (ρ n) = ret (ρ n)
conclude. Qed.
ρ: nat -> nat

forall t1 t2 : Lam nat, nat -> rename ρ (⟨ t1 ⟩ (t2) : Lam nat) = (⟨ rename ρ t1 ⟩ (rename ρ t2))
ρ: nat -> nat

forall t1 t2 : Lam nat, nat -> rename ρ (⟨ t1 ⟩ (t2) : Lam nat) = (⟨ rename ρ t1 ⟩ (rename ρ t2))
ρ: nat -> nat
t1, t2: Lam nat
n: nat

rename ρ (⟨ t1 ⟩ (t2) : Lam nat) = (⟨ rename ρ t1 ⟩ (rename ρ t2))
ρ: nat -> nat
t1, t2: Lam nat
n: nat

(⟨ rename ρ t1 ⟩ (rename ρ t2)) = (⟨ rename ρ t1 ⟩ (rename ρ t2))
conclude. Qed.
ρ: nat -> nat

forall (τ : typ) (t : Lam nat), rename ρ ((λ) τ t : Lam nat) = (λ) τ (rename (up__ren ρ) t)
ρ: nat -> nat

forall (τ : typ) (t : Lam nat), rename ρ ((λ) τ t : Lam nat) = (λ) τ (rename (up__ren ρ) t)
ρ: nat -> nat
τ: typ
t: Lam nat

rename ρ ((λ) τ t : Lam nat) = (λ) τ (rename (up__ren ρ) t)
ρ: nat -> nat
τ: typ
t: Lam nat

(λ) τ (rename (up__ren ρ) t) = (λ) τ (rename (up__ren ρ) t)
conclude. Qed. End rename. Section subst. Context (σ: nat -> Lam nat).
σ: nat -> Lam nat

forall n : nat, (tvar n : Lam nat).[σ] = σ n
σ: nat -> Lam nat

forall n : nat, (tvar n : Lam nat).[σ] = σ n
σ: nat -> Lam nat
n: nat

(tvar n : Lam nat).[σ] = σ n
σ: nat -> Lam nat
n: nat

σ n = σ n
conclude. Qed.
σ: nat -> Lam nat

forall t1 t2 : Lam nat, (⟨ t1 ⟩ (t2) : Lam nat).[σ] = (⟨ t1.[σ] ⟩ (t2.[σ]))
σ: nat -> Lam nat

forall t1 t2 : Lam nat, (⟨ t1 ⟩ (t2) : Lam nat).[σ] = (⟨ t1.[σ] ⟩ (t2.[σ]))
σ: nat -> Lam nat
t1, t2: Lam nat

(⟨ t1 ⟩ (t2) : Lam nat).[σ] = (⟨ t1.[σ] ⟩ (t2.[σ]))
σ: nat -> Lam nat
t1, t2: Lam nat

(⟨ t1.[σ] ⟩ (t2.[σ])) = (⟨ t1.[σ] ⟩ (t2.[σ]))
conclude. Qed.
σ: nat -> Lam nat

forall (τ : typ) (t : Lam nat), ((λ) τ t : Lam nat).[σ] = (λ) τ t.[up__sub σ]
σ: nat -> Lam nat

forall (τ : typ) (t : Lam nat), ((λ) τ t : Lam nat).[σ] = (λ) τ t.[up__sub σ]
σ: nat -> Lam nat
τ: typ
t: Lam nat

((λ) τ t : Lam nat).[σ] = (λ) τ t.[up__sub σ]
σ: nat -> Lam nat
τ: typ
t: Lam nat

(λ) τ t.[up__sub σ] = (λ) τ t.[up__sub σ]
conclude. Qed. End subst. (** ** Rewriting Lemmas for <<subst>> *) (**********************************************************************) Section subst. Context (σ: nat -> Lam nat).
σ: nat -> Lam nat

subst ret = id
σ: nat -> Lam nat

subst ret = id
σ: nat -> Lam nat

id = id
conclude. Qed.
σ: nat -> Lam nat

forall t : Lam nat, t.[ret] = t
σ: nat -> Lam nat

forall t : Lam nat, t.[ret] = t
σ: nat -> Lam nat
t: Lam nat

t.[ret] = t
σ: nat -> Lam nat
t: Lam nat

t = t
conclude. Qed.
σ: nat -> Lam nat

forall t1 t2 : Lam nat, (⟨ t1 ⟩ (t2)).[σ] = (⟨ t1.[σ] ⟩ (t2.[σ]))
σ: nat -> Lam nat

forall t1 t2 : Lam nat, (⟨ t1 ⟩ (t2)).[σ] = (⟨ t1.[σ] ⟩ (t2.[σ]))
σ: nat -> Lam nat
t1, t2: Lam nat

(⟨ t1 ⟩ (t2)).[σ] = (⟨ t1.[σ] ⟩ (t2.[σ]))
σ: nat -> Lam nat
t1, t2: Lam nat

(⟨ t1.[σ] ⟩ (t2.[σ])) = (⟨ t1.[σ] ⟩ (t2.[σ]))
conclude. Qed.
σ: nat -> Lam nat

forall (τ : typ) (t : Lam nat), ((λ) τ t : Lam nat).[σ] = (λ) τ t.[up__sub σ]
σ: nat -> Lam nat

forall (τ : typ) (t : Lam nat), ((λ) τ t : Lam nat).[σ] = (λ) τ t.[up__sub σ]
σ: nat -> Lam nat
τ: typ
t: Lam nat

((λ) τ t : Lam nat).[σ] = (λ) τ t.[up__sub σ]
σ: nat -> Lam nat
τ: typ
t: Lam nat

(λ) τ t.[ret 0 .: σ >>> subst ((+1) >>> ret)] = (λ) τ t.[ret 0 .: σ >>> subst ((+1) >>> ret)]
conclude. Qed. End subst.