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
  Simplification.Tests.Support.

Import STLC.Syntax.TermNotations.

(** ** Rewriting lemmas for <<LC>> *)
(******************************************************************************)

forall n m : nat, LCn m (tvar n) <-> n < m

forall n m : nat, LCn m (tvar n) <-> n < m
n, m: nat

LCn m (tvar n) <-> n < m
n, m: nat

n < m <-> n < m
reflexivity. Qed.

forall (x : atom) (m : nat), LCn m (tvar x) <-> True

forall (x : atom) (m : nat), LCn m (tvar x) <-> True
x: atom
m: nat

LCn m (tvar x) <-> True
x: atom
m: nat

True <-> True
reflexivity. Qed.

forall (X : typ) (t : term) (m : nat), LCn m ((λ) X t) <-> LCn (S m) t

forall (X : typ) (t : term) (m : nat), LCn m ((λ) X t) <-> LCn (S m) t
X: typ
t: term
m: nat

LCn m ((λ) X t) <-> LCn (S m) t
X: typ
t: term
m: nat

LCn (S m) t <-> LCn (S m) t
reflexivity. Qed.

forall (t1 t2 : term) (m : nat), LCn m (⟨ t1 ⟩ (t2)) <-> LCn m t1 /\ LCn m t2

forall (t1 t2 : term) (m : nat), LCn m (⟨ t1 ⟩ (t2)) <-> LCn m t1 /\ LCn m t2
t1, t2: term
m: nat

LCn m (⟨ t1 ⟩ (t2)) <-> LCn m t1 /\ LCn m t2
t1, t2: term
m: nat

LCn m t1 ● LCn m t2 <-> LCn m t1 /\ LCn m t2
reflexivity. Qed.

forall n : nat, LC (tvar n) <-> False

forall n : nat, LC (tvar n) <-> False
n: nat

LC (tvar n) <-> False
n: nat

False <-> False
lia. Qed.

forall x : atom, LC (tvar x) <-> True

forall x : atom, LC (tvar x) <-> True
x: atom

LC (tvar x) <-> True
x: atom

True <-> True
reflexivity. Qed.

forall (X : typ) (t : term), LC ((λ) X t) <-> LCn 1 t

forall (X : typ) (t : term), LC ((λ) X t) <-> LCn 1 t
X: typ
t: term

LC ((λ) X t) <-> LCn 1 t
X: typ
t: term

LCn 1 t <-> LCn 1 t
reflexivity. Qed.

forall t1 t2 : term, LC (⟨ t1 ⟩ (t2)) <-> LC t1 /\ LC t2

forall t1 t2 : term, LC (⟨ t1 ⟩ (t2)) <-> LC t1 /\ LC t2
t1, t2: term

LC (⟨ t1 ⟩ (t2)) <-> LC t1 /\ LC t2
t1, t2: term

LC t1 ● LC t2 <-> LC t1 /\ LC t2
reflexivity. Qed. (** ** Rewriting lemmas for <<free>>, <<freeset>> *) (******************************************************************************) Section term_free_rewrite.

forall b : nat, free (tvar b) = []

forall b : nat, free (tvar b) = []
b: nat

free (tvar b) = []
b: nat

[] = []
reflexivity. Qed.

forall (b : nat) (x : atom), x ∈ free (tvar b) <-> False

forall (b : nat) (x : atom), x ∈ free (tvar b) <-> False
b: nat
x: atom

x ∈ free (tvar b) <-> False
b: nat
x: atom

x ∈ [] <-> False
reflexivity. Qed.

forall y : atom, free (tvar y) = [y]

forall y : atom, free (tvar y) = [y]
y: atom

free (tvar y) = [y]
y: atom

[y] = [y]
reflexivity. Qed.

forall y x : atom, x ∈ free (tvar y) <-> x = y

forall y x : atom, x ∈ free (tvar y) <-> x = y
y, x: atom

x ∈ free (tvar y) <-> x = y
y, x: atom

x = y <-> x = y
reflexivity. Qed.

forall (t : term) (X : typ), free ((λ) X t) = free t

forall (t : term) (X : typ), free ((λ) X t) = free t
t: term
X: typ

free ((λ) X t) = free t
t: term
X: typ

free t = free t
reflexivity. Qed.

forall (x : atom) (t : term) (X : typ), x ∈ free ((λ) X t) <-> x ∈ free t

forall (x : atom) (t : term) (X : typ), x ∈ free ((λ) X t) <-> x ∈ free t
x: atom
t: term
X: typ

x ∈ free ((λ) X t) <-> x ∈ free t
x: atom
t: term
X: typ

x ∈ free t <-> x ∈ free t
reflexivity. Qed.

atom -> forall t1 t2 : term, free (⟨ t1 ⟩ (t2)) = free t1 ++ free t2

atom -> forall t1 t2 : term, free (⟨ t1 ⟩ (t2)) = free t1 ++ free t2
x: atom
t1, t2: term

free (⟨ t1 ⟩ (t2)) = free t1 ++ free t2
x: atom
t1, t2: term

free t1 ++ free t2 = free t1 ++ free t2
reflexivity. Qed.

forall (x : atom) (t1 t2 : term), x ∈ free (⟨ t1 ⟩ (t2)) <-> x ∈ free t1 \/ x ∈ free t2

forall (x : atom) (t1 t2 : term), x ∈ free (⟨ t1 ⟩ (t2)) <-> x ∈ free t1 \/ x ∈ free t2
x: atom
t1, t2: term

x ∈ free (⟨ t1 ⟩ (t2)) <-> x ∈ free t1 \/ x ∈ free t2
x: atom
t1, t2: term

x ∈ free t1 \/ x ∈ free t2 <-> x ∈ free t1 \/ x ∈ free t2
reflexivity. Qed.

forall (b : nat) (x : atom), x `in` FV (tvar b) <-> False

forall (b : nat) (x : atom), x `in` FV (tvar b) <-> False
b: nat
x: atom

x `in` FV (tvar b) <-> False
b: nat
x: atom

False <-> False
reflexivity. Qed.

forall y x : atom, x `in` FV (tvar y) <-> x = y

forall y x : atom, x `in` FV (tvar y) <-> x = y
y, x: atom

x `in` FV (tvar y) <-> x = y
y, x: atom

x = y <-> x = y
reflexivity. Qed.

forall (x : atom) (t : term) (X : typ), x `in` FV ((λ) X t) <-> x `in` FV t

forall (x : atom) (t : term) (X : typ), x `in` FV ((λ) X t) <-> x `in` FV t
x: atom
t: term
X: typ

x `in` FV ((λ) X t) <-> x `in` FV t
x: atom
t: term
X: typ

x `in` FV t <-> x `in` FV t
reflexivity. Qed.

forall (x : atom) (t1 t2 : term), x `in` FV (⟨ t1 ⟩ (t2)) <-> x `in` FV t1 \/ x `in` FV t2

forall (x : atom) (t1 t2 : term), x `in` FV (⟨ t1 ⟩ (t2)) <-> x `in` FV t1 \/ x `in` FV t2
x: atom
t1, t2: term

x `in` FV (⟨ t1 ⟩ (t2)) <-> x `in` FV t1 \/ x `in` FV t2
x: atom
t1, t2: term

x `in` FV t1 \/ x `in` FV t2 <-> x `in` FV t1 \/ x `in` FV t2
reflexivity. Qed. Open Scope set_scope.

forall b : nat, atom -> FV (tvar b) [=] ∅

forall b : nat, atom -> FV (tvar b) [=] ∅
b: nat
x: atom

FV (tvar b) [=] ∅
b: nat
x: atom

∅ [=] ∅
fsetdec. Qed.

forall y : atom, FV (tvar y) [=] {{y}}

forall y : atom, FV (tvar y) [=] {{y}}
y: atom

FV (tvar y) [=] {{y}}
y: atom

{{y}} [=] {{y}}
fsetdec. Qed.

forall (t : term) (X : typ), FV ((λ) X t) [=] FV t

forall (t : term) (X : typ), FV ((λ) X t) [=] FV t
t: term
X: typ

FV ((λ) X t) [=] FV t
t: term
X: typ

FV t [=] FV t
fsetdec. Qed.

forall t1 t2 : term, FV (⟨ t1 ⟩ (t2)) [=] FV t1 ∪ FV t2

forall t1 t2 : term, FV (⟨ t1 ⟩ (t2)) [=] FV t1 ∪ FV t2
t1, t2: term

FV (⟨ t1 ⟩ (t2)) [=] FV t1 ∪ FV t2
t1, t2: term

FV t1 ∪ FV t2 [=] FV t1 ∪ FV t2
fsetdec. Qed. End term_free_rewrite. (** ** Rewriting lemmas for <<open>> *) (******************************************************************************)

forall (v : LN) (u : term), open u (tvar v) = open_loc u (0, v)

forall (v : LN) (u : term), open u (tvar v) = open_loc u (0, v)
v: LN
u: term

open u (tvar v) = open_loc u (0, v)
v: LN
u: term

open_loc u (Ƶ, v) = open_loc u (0, v)
reflexivity. Qed.

forall t1 t2 u : term, open u (⟨ t1 ⟩ (t2)) = (⟨ open u t1 ⟩ (open u t2))

forall t1 t2 u : term, open u (⟨ t1 ⟩ (t2)) = (⟨ open u t1 ⟩ (open u t2))
t1, t2, u: term

open u (⟨ t1 ⟩ (t2)) = (⟨ open u t1 ⟩ (open u t2))
t1, t2, u: term

(⟨ open u t1 ⟩ (open u t2)) = (⟨ open u t1 ⟩ (open u t2))
reflexivity. Qed.

forall (τ : typ) (t u : term), open u ((λ) τ t) = (λ) τ (bindd (open_loc u ⦿ 1) t)

forall (τ : typ) (t u : term), open u ((λ) τ t) = (λ) τ (bindd (open_loc u ⦿ 1) t)
τ: typ
t, u: term

open u ((λ) τ t) = (λ) τ (bindd (open_loc u ⦿ 1) t)
τ: typ
t, u: term

(λ) τ (bindd (open_loc u ⦿ 1) t) = (λ) τ (bindd (open_loc u ⦿ 1) t)
reflexivity. Qed. (** ** Rewriting lemmas for <<subst>> *) (******************************************************************************)

forall (v : LN) (x : atom) (u : term), subst x u (tvar v) = subst_loc x u v

forall (v : LN) (x : atom) (u : term), subst x u (tvar v) = subst_loc x u v
v: LN
x: atom
u: term

subst x u (tvar v) = subst_loc x u v
v: LN
x: atom
u: term

subst_loc x u v = subst_loc x u v
conclude. Qed.

forall (t1 t2 : term) (x : atom) (u : term), subst x u (⟨ t1 ⟩ (t2)) = (⟨ subst x u t1 ⟩ (subst x u t2))

forall (t1 t2 : term) (x : atom) (u : term), subst x u (⟨ t1 ⟩ (t2)) = (⟨ subst x u t1 ⟩ (subst x u t2))
t1, t2: term
x: atom
u: term

subst x u (⟨ t1 ⟩ (t2)) = (⟨ subst x u t1 ⟩ (subst x u t2))
t1, t2: term
x: atom
u: term

(⟨ subst x u t1 ⟩ (subst x u t2)) = (⟨ subst x u t1 ⟩ (subst x u t2))
conclude. Qed.

forall (τ : typ) (t : term) (x : atom) (u : term), subst x u ((λ) τ t) = (λ) τ (subst x u t)

forall (τ : typ) (t : term) (x : atom) (u : term), subst x u ((λ) τ t) = (λ) τ (subst x u t)
τ: typ
t: term
x: atom
u: term

subst x u ((λ) τ t) = (λ) τ (subst x u t)
τ: typ
t: term
x: atom
u: term

(λ) τ (subst x u t) = (λ) τ (subst x u t)
conclude. Qed.

forall (v : LN) (x : atom) (u : term), v = x -> subst x u (tvar v) = u

forall (v : LN) (x : atom) (u : term), v = x -> subst x u (tvar v) = u
v: LN
x: atom
u: term
H: v = x

subst x u (tvar v) = u
v: LN
x: atom
u: term
H: v = x

u = u
conclude. Qed.

forall (v : LN) (x : atom) (u : term), v <> x -> subst x u (tvar v) = tvar v

forall (v : LN) (x : atom) (u : term), v <> x -> subst x u (tvar v) = tvar v
v: LN
x: atom
u: term
H: v <> x

subst x u (tvar v) = tvar v
v: LN
x: atom
u: term
H: v <> x

ret v = ret v
conclude. Qed.

forall (y x : atom) (u : term), x = y -> subst x u (tvar y) = u

forall (y x : atom) (u : term), x = y -> subst x u (tvar y) = u
y, x: atom
u: term
H: x = y

subst x u (tvar y) = u
y, x: atom
u: term
H: x = y

u = u
conclude. Qed.

forall (y x : atom) (u : term), x <> y -> subst x u (tvar y) = tvar y

forall (y x : atom) (u : term), x <> y -> subst x u (tvar y) = tvar y
y, x: atom
u: term
H: x <> y

subst x u (tvar y) = tvar y
y, x: atom
u: term
H: x <> y

ret y = ret y
conclude. Qed.

forall (v y x : atom) (u : term), y <> x -> v = x -> subst x u (⟨ ret v ⟩ (ret y)) = (⟨ u ⟩ (ret v))

forall (v y x : atom) (u : term), y <> x -> v = x -> subst x u (⟨ ret v ⟩ (ret y)) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

subst x u (⟨ ret v ⟩ (ret y)) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

bind (subst_loc x u) (⟨ ret v ⟩ (ret y)) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

bindd (subst_loc x u ∘ extract) (⟨ ret v ⟩ (ret y)) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

binddt (subst_loc x u ∘ extract) (⟨ ret v ⟩ (ret y)) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

pure (app (V:=LN)) <⋆> binddt (subst_loc x u ∘ extract) (ret v) <⋆> binddt (subst_loc x u ∘ extract) (ret y) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

pure (app (V:=LN)) <⋆> binddt (subst_loc x u ∘ extract) (ret v) <⋆> binddt (subst_loc x u ∘ extract) (ret y) = (⟨ u ⟩ (ret v))
v, y, x: atom
u: term
H: y <> x
H0: v = x

pure (app (V:=LN)) <⋆> (subst_loc x u ∘ extract) (0, v) <⋆> (subst_loc x u ∘ extract) (0, y) = (⟨ u ⟩ (ret v))
Abort.

forall (v y : LN) (x : atom) (u : term), y <> x -> v = x -> subst x u (⟨ tvar v ⟩ (tvar y)) = u

forall (v y : LN) (x : atom) (u : term), y <> x -> v = x -> subst x u (⟨ tvar v ⟩ (tvar y)) = u
v, y: LN
x: atom
u: term
H: y <> x
H0: v = x

subst x u (⟨ tvar v ⟩ (tvar y)) = u
v, y: LN
x: atom
u: term
H: y <> x
H0: v = x

bind (subst_loc x u) (⟨ tvar v ⟩ (tvar y)) = u
v, y: LN
x: atom
u: term
H: y <> x
H0: v = x

bindd (subst_loc x u ∘ extract) (⟨ tvar v ⟩ (tvar y)) = u
v, y: LN
x: atom
u: term
H: y <> x
H0: v = x

binddt (subst_loc x u ∘ extract) (⟨ tvar v ⟩ (tvar y)) = u
v, y: LN
x: atom
u: term
H: y <> x
H0: v = x

pure (app (V:=LN)) <⋆> (subst_loc x u ∘ extract) (0, v) <⋆> (subst_loc x u ∘ extract) (0, y) = u
Abort.