Reasoning Details

 < Module lambda_calculus:pair.
 < Prove_Constraint lambda_calculus:host:proj_is.

Subgoal 1:

Variables: T2 T1
Hyp : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Hyp1 : is_e (pair T1 T2)
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < case Hyp1.

Subgoal 1:

Variables: T2 T1
Hyp : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
H1 : is_e T1
H2 : is_e T2
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < search 20.

Subgoal 2:

Variables: T
Hyp : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
Hyp1 : is_e (fst T)
============================
 is_e (app T (abs "A" (abs "B" (var "A"))))
 < case Hyp1.

Subgoal 2:

Variables: T
Hyp : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
H1 : is_e T
============================
 is_e (app T (abs "A" (abs "B" (var "A"))))
 < search 10.

Subgoal 3:

Variables: T
Hyp : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
Hyp1 : is_e (snd T)
============================
 is_e (app T (abs "A" (abs "B" (var "B"))))
 < case Hyp1.

Subgoal 3:

Variables: T
Hyp : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
H1 : is_e T
============================
 is_e (app T (abs "A" (abs "B" (var "B"))))
 < search 10.

Proof completed.
 < Add_Proj_Rel lambda_calculus:host:is_e.

Proof completed.
 < Prove_Ext_Ind lambda_calculus:host:is_e.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 6:

Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (pair E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
============================
 <is_e {P}> (pair E1 E2)
 < apply IH to R1.

Subgoal 6:

Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (pair E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (pair E1 E2)
 < apply IH to R2.

Subgoal 6:

Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (pair E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
H2 : <is_e {P}> E2
============================
 <is_e {P}> (pair E1 E2)
 < search 20.

Subgoal 7:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (fst E1) @
R1 : is_e E1 *
============================
 <is_e {P}> (fst E1)
 < apply IH to R1.

Subgoal 7:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (fst E1) @
R1 : is_e E1 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (fst E1)
 < search 10.

Subgoal 8:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (snd E1) @
R1 : is_e E1 *
============================
 <is_e {P}> (snd E1)
 < apply IH to R1.

Subgoal 8:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (snd E1) @
R1 : is_e E1 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (snd E1)
 < search 10.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_same.

Subgoal 1:

Variables: E2 T2 T1
Hyp : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Hyp1 : |{e}- pair T1 T2 ~~> E2
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2 = E2
 < case Hyp1.

Subgoal 1:

Variables: T2 T1
Hyp : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
 < search.

Subgoal 2:

Variables: E2 T
Hyp : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
Hyp1 : |{e}- fst T ~~> E2
============================
 app T (abs "A" (abs "B" (var "A"))) = E2
 < case Hyp1.

Subgoal 2:

Variables: T
Hyp : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
============================
 app T (abs "A" (abs "B" (var "A"))) = app T (abs "A" (abs "B" (var "A")))
 < search.

Subgoal 3:

Variables: E2 T
Hyp : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
Hyp1 : |{e}- snd T ~~> E2
============================
 app T (abs "A" (abs "B" (var "B"))) = E2
 < case Hyp1.

Subgoal 3:

Variables: T
Hyp : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
============================
 app T (abs "A" (abs "B" (var "B"))) = app T (abs "A" (abs "B" (var "B")))
 < search.

Proof completed.
 < Prove lambda_calculus:host:subst_exists.

Subgoal 6:

Variables: X R E2 E1
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (pair E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 exists S, subst X R (pair E1 E2) S
 < apply IH to IsE1 IsX IsR.

Subgoal 6:

Variables: X R E2 E1 S
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (pair E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
IsE2 : is_e E2 *
H1 : subst X R E1 S
============================
 exists S, subst X R (pair E1 E2) S
 < apply IH to IsE2 IsX IsR.

Subgoal 6:

Variables: X R E2 E1 S S1
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (pair E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
IsE2 : is_e E2 *
H1 : subst X R E1 S
H2 : subst X R E2 S1
============================
 exists S, subst X R (pair E1 E2) S
 < search.

Subgoal 7:

Variables: X R E1
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (fst E1) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
============================
 exists S, subst X R (fst E1) S
 < apply IH to IsE1 IsX IsR.

Subgoal 7:

Variables: X R E1 S
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (fst E1) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
H1 : subst X R E1 S
============================
 exists S, subst X R (fst E1) S
 < search.

Subgoal 8:

Variables: X R E1
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (snd E1) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
============================
 exists S, subst X R (snd E1) S
 < apply IH to IsE1 IsX IsR.

Subgoal 8:

Variables: X R E1 S
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (snd E1) @
IsX : is_string X
IsR : is_e R
IsE1 : is_e E1 *
H1 : subst X R E1 S
============================
 exists S, subst X R (snd E1) S
 < search.

Proof completed.
 < Prove lambda_calculus:host:subst_is.

Subgoal 8:

Variables: X R S2 S1 T2 T1
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsE : is_e (pair T1 T2)
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
S1 : subst X R T1 S1 *
S2 : subst X R T2 S2 *
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2)
 < case IsE.

Subgoal 8:

Variables: X R S2 S1 T2 T1
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
S1 : subst X R T1 S1 *
S2 : subst X R T2 S2 *
H1 : is_e T1
H2 : is_e T2
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2)
 < apply IH to _ _ _ S1.

Subgoal 8:

Variables: X R S2 S1 T2 T1
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
S1 : subst X R T1 S1 *
S2 : subst X R T2 S2 *
H1 : is_e T1
H2 : is_e T2
H3 : is_e S1
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2)
 < apply IH to _ _ _ S2.

Subgoal 8:

Variables: X R S2 S1 T2 T1
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
S1 : subst X R T1 S1 *
S2 : subst X R T2 S2 *
H1 : is_e T1
H2 : is_e T2
H3 : is_e S1
H4 : is_e S2
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2)
 < search 20.

Subgoal 9:

Variables: X R S1 T
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsE : is_e (fst T)
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) (app S1 (abs "A" (abs "B" (var "A")))) @
S1 : subst X R T S1 *
============================
 is_e (app S1 (abs "A" (abs "B" (var "A"))))
 < case IsE.

Subgoal 9:

Variables: X R S1 T
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) (app S1 (abs "A" (abs "B" (var "A")))) @
S1 : subst X R T S1 *
H1 : is_e T
============================
 is_e (app S1 (abs "A" (abs "B" (var "A"))))
 < apply IH to _ _ _ S1.

Subgoal 9:

Variables: X R S1 T
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) (app S1 (abs "A" (abs "B" (var "A")))) @
S1 : subst X R T S1 *
H1 : is_e T
H2 : is_e S1
============================
 is_e (app S1 (abs "A" (abs "B" (var "A"))))
 < search 10.

Subgoal 10:

Variables: X R S1 T
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsE : is_e (snd T)
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) (app S1 (abs "A" (abs "B" (var "B")))) @
S1 : subst X R T S1 *
============================
 is_e (app S1 (abs "A" (abs "B" (var "B"))))
 < case IsE.

Subgoal 10:

Variables: X R S1 T
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) (app S1 (abs "A" (abs "B" (var "B")))) @
S1 : subst X R T S1 *
H1 : is_e T
============================
 is_e (app S1 (abs "A" (abs "B" (var "B"))))
 < apply IH to _ _ _ S1.

Subgoal 10:

Variables: X R S1 T
IH : forall X R E S,
       is_e E -> is_string X -> is_e R -> subst X R E S * -> is_e S
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) (app S1 (abs "A" (abs "B" (var "B")))) @
S1 : subst X R T S1 *
H1 : is_e T
H2 : is_e S1
============================
 is_e (app S1 (abs "A" (abs "B" (var "B"))))
 < search 10.

Proof completed.
 < Prove lambda_calculus:host:eval_is.

Subgoal 5:

Variables: V T2 T1
IH : forall E V, is_e E -> eval E V * -> is_e V
IsE : is_e (pair T1 T2)
Ev : eval (pair T1 T2) V @
Ev1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V *
============================
 is_e V
 < case IsE.

Subgoal 5:

Variables: V T2 T1
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (pair T1 T2) V @
Ev1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V *
H1 : is_e T1
H2 : is_e T2
============================
 is_e V
 < apply IH to _ Ev1.

Subgoal 5.1:

Variables: V T2 T1
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (pair T1 T2) V @
Ev1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V *
H1 : is_e T1
H2 : is_e T2
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < search 20.

Subgoal 5:

Variables: V T2 T1
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (pair T1 T2) V @
Ev1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V *
H1 : is_e T1
H2 : is_e T2
H3 : is_e V
============================
 is_e V
 < search.

Subgoal 6:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
IsE : is_e (fst T)
Ev : eval (fst T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "A")))) V *
============================
 is_e V
 < case IsE.

Subgoal 6:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (fst T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "A")))) V *
H1 : is_e T
============================
 is_e V
 < apply IH to _ Ev1.

Subgoal 6.1:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (fst T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "A")))) V *
H1 : is_e T
============================
 is_e (app T (abs "A" (abs "B" (var "A"))))
 < search 10.

Subgoal 6:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (fst T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "A")))) V *
H1 : is_e T
H2 : is_e V
============================
 is_e V
 < search.

Subgoal 7:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
IsE : is_e (snd T)
Ev : eval (snd T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "B")))) V *
============================
 is_e V
 < case IsE.

Subgoal 7:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (snd T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "B")))) V *
H1 : is_e T
============================
 is_e V
 < apply IH to _ Ev1.

Subgoal 7.1:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (snd T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "B")))) V *
H1 : is_e T
============================
 is_e (app T (abs "A" (abs "B" (var "B"))))
 < search 10.

Subgoal 7:

Variables: V T
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (snd T) V @
Ev1 : eval (app T (abs "A" (abs "B" (var "B")))) V *
H1 : is_e T
H2 : is_e V
============================
 is_e V
 < search.

Proof completed.
 < Prove lambda_calculus:host:subst_unique.

Subgoal 8:

Variables: X R SB S2 S1 T2 T1
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsE : is_e (pair T1 T2)
IsX : is_string X
IsR : is_e R
SA : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
SB : subst X R (pair T1 T2) SB
SA1 : subst X R T1 S1 *
SA2 : subst X R T2 S2 *
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2 = SB
 < case IsE.

Subgoal 8:

Variables: X R SB S2 S1 T2 T1
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
SB : subst X R (pair T1 T2) SB
SA1 : subst X R T1 S1 *
SA2 : subst X R T2 S2 *
H1 : is_e T1
H2 : is_e T2
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2 = SB
 < SB: case SB.

Subgoal 8:

Variables: X R S2 S1 T2 T1 S4 S3
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2) @
SA1 : subst X R T1 S1 *
SA2 : subst X R T2 S2 *
H1 : is_e T1
H2 : is_e T2
SB : subst X R T1 S3
SB1 : subst X R T2 S4
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S4
 < apply IH to _ _ _ SA1 SB.

Subgoal 8:

Variables: X R S2 T2 T1 S4 S3
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S2) @
SA1 : subst X R T1 S3 *
SA2 : subst X R T2 S2 *
H1 : is_e T1
H2 : is_e T2
SB : subst X R T1 S3
SB1 : subst X R T2 S4
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S2 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S4
 < apply IH to _ _ _ SA2 SB1.

Subgoal 8:

Variables: X R T2 T1 S4 S3
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (pair T1 T2) (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S4) @
SA1 : subst X R T1 S3 *
SA2 : subst X R T2 S4 *
H1 : is_e T1
H2 : is_e T2
SB : subst X R T1 S3
SB1 : subst X R T2 S4
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S3) S4
 < search 20.

Subgoal 9:

Variables: X R SB S T
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsE : is_e (fst T)
IsX : is_string X
IsR : is_e R
SA : subst X R (fst T) (app S (abs "A" (abs "B" (var "A")))) @
SB : subst X R (fst T) SB
SA1 : subst X R T S *
============================
 app S (abs "A" (abs "B" (var "A"))) = SB
 < case IsE.

Subgoal 9:

Variables: X R SB S T
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (fst T) (app S (abs "A" (abs "B" (var "A")))) @
SB : subst X R (fst T) SB
SA1 : subst X R T S *
H1 : is_e T
============================
 app S (abs "A" (abs "B" (var "A"))) = SB
 < SB: case SB.

Subgoal 9:

Variables: X R S T S1
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (fst T) (app S (abs "A" (abs "B" (var "A")))) @
SA1 : subst X R T S *
H1 : is_e T
SB : subst X R T S1
============================
 app S (abs "A" (abs "B" (var "A"))) = app S1 (abs "A" (abs "B" (var "A")))
 < apply IH to _ _ _ SA1 SB.

Subgoal 9:

Variables: X R T S1
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (fst T) (app S1 (abs "A" (abs "B" (var "A")))) @
SA1 : subst X R T S1 *
H1 : is_e T
SB : subst X R T S1
============================
 app S1 (abs "A" (abs "B" (var "A"))) = app S1 (abs "A" (abs "B" (var "A")))
 < search.

Subgoal 10:

Variables: X R SB S T
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsE : is_e (snd T)
IsX : is_string X
IsR : is_e R
SA : subst X R (snd T) (app S (abs "A" (abs "B" (var "B")))) @
SB : subst X R (snd T) SB
SA1 : subst X R T S *
============================
 app S (abs "A" (abs "B" (var "B"))) = SB
 < case IsE.

Subgoal 10:

Variables: X R SB S T
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (snd T) (app S (abs "A" (abs "B" (var "B")))) @
SB : subst X R (snd T) SB
SA1 : subst X R T S *
H1 : is_e T
============================
 app S (abs "A" (abs "B" (var "B"))) = SB
 < SB: case SB.

Subgoal 10:

Variables: X R S T S1
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (snd T) (app S (abs "A" (abs "B" (var "B")))) @
SA1 : subst X R T S *
H1 : is_e T
SB : subst X R T S1
============================
 app S (abs "A" (abs "B" (var "B"))) = app S1 (abs "A" (abs "B" (var "B")))
 < apply IH to _ _ _ SA1 SB.

Subgoal 10:

Variables: X R T S1
IH : forall X R E SA SB,
       is_e E -> is_string X -> is_e R -> subst X R E SA * -> subst X R E SB -> SA = SB
IsX : is_string X
IsR : is_e R
SA : subst X R (snd T) (app S1 (abs "A" (abs "B" (var "B")))) @
SA1 : subst X R T S1 *
H1 : is_e T
SB : subst X R T S1
============================
 app S1 (abs "A" (abs "B" (var "B"))) = app S1 (abs "A" (abs "B" (var "B")))
 < search.

Proof completed.
 < Prove lambda_calculus:host:eval_unique.

Subgoal 5:

Variables: VA VB T2 T1
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
IsE : is_e (pair T1 T2)
EvA : eval (pair T1 T2) VA @
EvB : eval (pair T1 T2) VB
EvA1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VA *
============================
 VA = VB
 < case IsE.

Subgoal 5:

Variables: VA VB T2 T1
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (pair T1 T2) VA @
EvB : eval (pair T1 T2) VB
EvA1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VA *
H1 : is_e T1
H2 : is_e T2
============================
 VA = VB
 < EvB: case EvB.

Subgoal 5:

Variables: VA VB T2 T1
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (pair T1 T2) VA @
EvA1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VA *
H1 : is_e T1
H2 : is_e T2
EvB : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VB
============================
 VA = VB
 < apply IH to _ EvA1 EvB.

Subgoal 5.1:

Variables: VA VB T2 T1
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (pair T1 T2) VA @
EvA1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VA *
H1 : is_e T1
H2 : is_e T2
EvB : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VB
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < search 20.

Subgoal 5:

Variables: VB T2 T1
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (pair T1 T2) VB @
EvA1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VB *
H1 : is_e T1
H2 : is_e T2
EvB : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) VB
============================
 VB = VB
 < search.

Subgoal 6:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
IsE : is_e (fst T)
EvA : eval (fst T) VA @
EvB : eval (fst T) VB
EvA1 : eval (app T (abs "A" (abs "B" (var "A")))) VA *
============================
 VA = VB
 < case IsE.

Subgoal 6:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (fst T) VA @
EvB : eval (fst T) VB
EvA1 : eval (app T (abs "A" (abs "B" (var "A")))) VA *
H1 : is_e T
============================
 VA = VB
 < EvB: case EvB.

Subgoal 6:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (fst T) VA @
EvA1 : eval (app T (abs "A" (abs "B" (var "A")))) VA *
H1 : is_e T
EvB : eval (app T (abs "A" (abs "B" (var "A")))) VB
============================
 VA = VB
 < apply IH to _ EvA1 EvB.

Subgoal 6.1:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (fst T) VA @
EvA1 : eval (app T (abs "A" (abs "B" (var "A")))) VA *
H1 : is_e T
EvB : eval (app T (abs "A" (abs "B" (var "A")))) VB
============================
 is_e (app T (abs "A" (abs "B" (var "A"))))
 < search 10.

Subgoal 6:

Variables: VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (fst T) VB @
EvA1 : eval (app T (abs "A" (abs "B" (var "A")))) VB *
H1 : is_e T
EvB : eval (app T (abs "A" (abs "B" (var "A")))) VB
============================
 VB = VB
 < search.

Subgoal 7:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
IsE : is_e (snd T)
EvA : eval (snd T) VA @
EvB : eval (snd T) VB
EvA1 : eval (app T (abs "A" (abs "B" (var "B")))) VA *
============================
 VA = VB
 < case IsE.

Subgoal 7:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (snd T) VA @
EvB : eval (snd T) VB
EvA1 : eval (app T (abs "A" (abs "B" (var "B")))) VA *
H1 : is_e T
============================
 VA = VB
 < EvB: case EvB.

Subgoal 7:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (snd T) VA @
EvA1 : eval (app T (abs "A" (abs "B" (var "B")))) VA *
H1 : is_e T
EvB : eval (app T (abs "A" (abs "B" (var "B")))) VB
============================
 VA = VB
 < apply IH to _ EvA1 EvB.

Subgoal 7.1:

Variables: VA VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (snd T) VA @
EvA1 : eval (app T (abs "A" (abs "B" (var "B")))) VA *
H1 : is_e T
EvB : eval (app T (abs "A" (abs "B" (var "B")))) VB
============================
 is_e (app T (abs "A" (abs "B" (var "B"))))
 < search 10.

Subgoal 7:

Variables: VB T
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (snd T) VB @
EvA1 : eval (app T (abs "A" (abs "B" (var "B")))) VB *
H1 : is_e T
EvB : eval (app T (abs "A" (abs "B" (var "B")))) VB
============================
 VB = VB
 < search.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_subst.

Subgoal 1:

Variables: X R S T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsE : is_e (pair T1 T2)
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) S
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < case IsE.

Subgoal 1:

Variables: X R S T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) S
H1 : is_e T1
H2 : is_e T2
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < S: case S.

Subgoal 1:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < OrA: apply is_string_eq_or_not to IsX _ with
          S2 = "A".

Subgoal 1:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
OrA : X = "A" \/ (X = "A" -> false)
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < OrB: apply is_string_eq_or_not to IsX _ with
          S2 = "B".

Subgoal 1:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
OrA : X = "A" \/ (X = "A" -> false)
OrB : X = "B" \/ (X = "B" -> false)
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < OrS: apply is_string_eq_or_not to IsX _ with
          S2 = "S".

Subgoal 1:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
OrA : X = "A" \/ (X = "A" -> false)
OrB : X = "B" \/ (X = "B" -> false)
OrS : X = "S" \/ (X = "S" -> false)
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < case OrA.

Subgoal 1.1:

Variables: R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "A"
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst "A" R T1 S1
S1 : subst "A" R T2 S2
OrB : "A" = "B" \/ ("A" = "B" -> false)
OrS : "A" = "S" \/ ("A" = "S" -> false)
============================
 exists S',
   subst "A" R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < search 20.

Subgoal 1.2:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
OrB : X = "B" \/ (X = "B" -> false)
OrS : X = "S" \/ (X = "S" -> false)
H3 : X = "A" -> false
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < case OrB.

Subgoal 1.2.1:

Variables: R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "B"
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst "B" R T1 S1
S1 : subst "B" R T2 S2
OrS : "B" = "S" \/ ("B" = "S" -> false)
H3 : "B" = "A" -> false
============================
 exists S',
   subst "B" R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < search 20.

Subgoal 1.2.2:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
OrS : X = "S" \/ (X = "S" -> false)
H3 : X = "A" -> false
H4 : X = "B" -> false
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < case OrS.

Subgoal 1.2.2.1:

Variables: R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "S"
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst "S" R T1 S1
S1 : subst "S" R T2 S2
H3 : "S" = "A" -> false
H4 : "S" = "B" -> false
============================
 exists S',
   subst "S" R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < search 20.

Subgoal 1.2.2.2:

Variables: X R T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
H3 : X = "A" -> false
H4 : X = "B" -> false
H5 : X = "S" -> false
============================
 exists S',
   subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
 < search 20.

Subgoal 2:

Variables: X R S T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsE : is_e (fst T)
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) S
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < case IsE.

Subgoal 2:

Variables: X R S T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) S
H1 : is_e T
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < S: case S.

Subgoal 2:

Variables: X R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < OrA: apply is_string_eq_or_not to IsX _ with
          S2 = "A".

Subgoal 2:

Variables: X R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
OrA : X = "A" \/ (X = "A" -> false)
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < OrB: apply is_string_eq_or_not to IsX _ with
          S2 = "B".

Subgoal 2:

Variables: X R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
OrA : X = "A" \/ (X = "A" -> false)
OrB : X = "B" \/ (X = "B" -> false)
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < case OrA.

Subgoal 2.1:

Variables: R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string "A"
IsR : is_e R
H1 : is_e T
S : subst "A" R T S1
OrB : "A" = "B" \/ ("A" = "B" -> false)
============================
 exists S', subst "A" R (app T (abs "A" (abs "B" (var "A")))) S'
 < search 10.

Subgoal 2.2:

Variables: X R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
OrB : X = "B" \/ (X = "B" -> false)
H2 : X = "A" -> false
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < case OrB.

Subgoal 2.2.1:

Variables: R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string "B"
IsR : is_e R
H1 : is_e T
S : subst "B" R T S1
H2 : "B" = "A" -> false
============================
 exists S', subst "B" R (app T (abs "A" (abs "B" (var "A")))) S'
 < search 10.

Subgoal 2.2.2:

Variables: X R T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
H2 : X = "A" -> false
H3 : X = "B" -> false
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "A")))) S'
 < search 10.

Subgoal 3:

Variables: X R S T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsE : is_e (snd T)
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) S
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < case IsE.

Subgoal 3:

Variables: X R S T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) S
H1 : is_e T
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < S: case S.

Subgoal 3:

Variables: X R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < OrA: apply is_string_eq_or_not to IsX _ with
          S2 = "A".

Subgoal 3:

Variables: X R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
OrA : X = "A" \/ (X = "A" -> false)
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < OrB: apply is_string_eq_or_not to IsX _ with
          S2 = "B".

Subgoal 3:

Variables: X R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
OrA : X = "A" \/ (X = "A" -> false)
OrB : X = "B" \/ (X = "B" -> false)
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < case OrA.

Subgoal 3.1:

Variables: R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string "A"
IsR : is_e R
H1 : is_e T
S : subst "A" R T S1
OrB : "A" = "B" \/ ("A" = "B" -> false)
============================
 exists S', subst "A" R (app T (abs "A" (abs "B" (var "B")))) S'
 < search 10.

Subgoal 3.2:

Variables: X R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
OrB : X = "B" \/ (X = "B" -> false)
H2 : X = "A" -> false
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < case OrB.

Subgoal 3.2.1:

Variables: R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string "B"
IsR : is_e R
H1 : is_e T
S : subst "B" R T S1
H2 : "B" = "A" -> false
============================
 exists S', subst "B" R (app T (abs "A" (abs "B" (var "B")))) S'
 < search 10.

Subgoal 3.2.2:

Variables: X R T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
H2 : X = "A" -> false
H3 : X = "B" -> false
============================
 exists S', subst X R (app T (abs "A" (abs "B" (var "B")))) S'
 < search 10.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_subst_same.

Subgoal 1:

Variables: X R S S' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsE : is_e (pair T1 T2)
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) S
S' : subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
============================
 S = S'
 < case IsE.

Subgoal 1:

Variables: X R S S' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
S : subst X R (pair T1 T2) S
S' : subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
H1 : is_e T1
H2 : is_e T2
============================
 S = S'
 < S: case S.

Subgoal 1:

Variables: X R S' T2 T1 S2 S1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
S' : subst X R (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) S'
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2 = S'
 < S': case S'.

Subgoal 1:

Variables: X R T2 T1 S2 S1 S4 S3
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S2
S' : subst X R (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) S3
S'1 : subst X R T2 S4
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S2 = app S3 S4
 < apply subst_unique to _ _ _ S1 S'1.

Subgoal 1:

Variables: X R T2 T1 S1 S4 S3
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S4
S' : subst X R (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) S3
S'1 : subst X R T2 S4
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S4 = app S3 S4
 < clear S'1.

Subgoal 1:

Variables: X R T2 T1 S1 S4 S3
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S4
S' : subst X R (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) S3
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S4 = app S3 S4
 < S': case S'.

Subgoal 1:

Variables: X R T2 T1 S1 S4 S6 S5
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S1
S1 : subst X R T2 S4
S' : subst X R (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S5
S'1 : subst X R T1 S6
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S1) S4 = app (app S5 S6) S4
 < apply subst_unique to _ _ _ S S'1.

Subgoal 1:

Variables: X R T2 T1 S4 S6 S5
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : subst X R (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S5
S'1 : subst X R T1 S6
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app S5 S6) S4
 < clear S'1.

Subgoal 1:

Variables: X R T2 T1 S4 S6 S5
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : subst X R (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S5
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app S5 S6) S4
 < S': case S'.

Subgoal 1.1:

Variables: R T2 T1 S4 S6
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "A"
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst "A" R T1 S6
S1 : subst "A" R T2 S4
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4
 < search 20.

Subgoal 1.2:

Variables: X R T2 T1 S4 S6 B
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : subst X R (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B")))) B
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" B) S6) S4
 < S': case S'1.

Subgoal 1.2.1:

Variables: R T2 T1 S4 S6
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "B"
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst "B" R T1 S6
S1 : subst "B" R T2 S4
S' : "B" = "A" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4
 < search 20.

Subgoal 1.2.2:

Variables: X R T2 T1 S4 S6 B1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : subst X R (abs "S" (app (app (var "S") (var "A")) (var "B"))) B1
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" B1)) S6) S4
 < S': case S'2.

Subgoal 1.2.2.1:

Variables: R T2 T1 S4 S6
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "S"
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst "S" R T1 S6
S1 : subst "S" R T2 S4
S' : "S" = "A" -> false
S'1 : "S" = "B" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4
 < search 20.

Subgoal 1.2.2.2:

Variables: X R T2 T1 S4 S6 B2
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : X = "S" -> false
S'3 : subst X R (app (app (var "S") (var "A")) (var "B")) B2
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" B2))) S6) S4
 < S': case S'3.

Subgoal 1.2.2.2:

Variables: X R T2 T1 S4 S6 S8 S7
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : X = "S" -> false
S'3 : subst X R (app (var "S") (var "A")) S7
S'4 : subst X R (var "B") S8
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app S7 S8)))) S6) S4
 < S': case S'3.

Subgoal 1.2.2.2:

Variables: X R T2 T1 S4 S6 S8 S10 S9
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : X = "S" -> false
S'4 : subst X R (var "B") S8
S'3 : subst X R (var "S") S9
S'5 : subst X R (var "A") S10
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app S9 S10) S8)))) S6) S4
 < case S'4.

Subgoal 1.2.2.2.1:

Variables: T2 T1 S4 S6 S8 S10 S9
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "B"
IsR : is_e S8
H1 : is_e T1
H2 : is_e T2
S : subst "B" S8 T1 S6
S1 : subst "B" S8 T2 S4
S' : "B" = "A" -> false
S'1 : "B" = "B" -> false
S'2 : "B" = "S" -> false
S'3 : subst "B" S8 (var "S") S9
S'5 : subst "B" S8 (var "A") S10
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app S9 S10) S8)))) S6) S4
 < apply S'1 to _.

Subgoal 1.2.2.2.2:

Variables: X R T2 T1 S4 S6 S10 S9
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : X = "S" -> false
S'3 : subst X R (var "S") S9
S'5 : subst X R (var "A") S10
H3 : X = "B" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app S9 S10) (var "B"))))) S6) S4
 < case S'3.

Subgoal 1.2.2.2.2.1:

Variables: T2 T1 S4 S6 S10 S9
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "S"
IsR : is_e S9
H1 : is_e T1
H2 : is_e T2
S : subst "S" S9 T1 S6
S1 : subst "S" S9 T2 S4
S' : "S" = "A" -> false
S'1 : "S" = "B" -> false
S'2 : "S" = "S" -> false
S'5 : subst "S" S9 (var "A") S10
H3 : "S" = "B" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app S9 S10) (var "B"))))) S6) S4
 < apply S'2 to _.

Subgoal 1.2.2.2.2.2:

Variables: X R T2 T1 S4 S6 S10
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : X = "S" -> false
S'5 : subst X R (var "A") S10
H3 : X = "B" -> false
H4 : X = "S" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") S10) (var "B"))))) S6) S4
 < case S'5.

Subgoal 1.2.2.2.2.2.1:

Variables: T2 T1 S4 S6 S10
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string "A"
IsR : is_e S10
H1 : is_e T1
H2 : is_e T2
S : subst "A" S10 T1 S6
S1 : subst "A" S10 T2 S4
S' : "A" = "A" -> false
S'1 : "A" = "B" -> false
S'2 : "A" = "S" -> false
H3 : "A" = "B" -> false
H4 : "A" = "S" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") S10) (var "B"))))) S6) S4
 < apply S' to _.

Subgoal 1.2.2.2.2.2.2:

Variables: X R T2 T1 S4 S6
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsX : is_string X
IsR : is_e R
H1 : is_e T1
H2 : is_e T2
S : subst X R T1 S6
S1 : subst X R T2 S4
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : X = "S" -> false
H3 : X = "B" -> false
H4 : X = "S" -> false
H5 : X = "A" -> false
============================
 app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4 = app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) S6) S4
 < search 20.

Subgoal 2:

Variables: X R S S' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsE : is_e (fst T)
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) S
S' : subst X R (app T (abs "A" (abs "B" (var "A")))) S'
============================
 S = S'
 < case IsE.

Subgoal 2:

Variables: X R S S' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
S : subst X R (fst T) S
S' : subst X R (app T (abs "A" (abs "B" (var "A")))) S'
H1 : is_e T
============================
 S = S'
 < S: case S.

Subgoal 2:

Variables: X R S' T S1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
S' : subst X R (app T (abs "A" (abs "B" (var "A")))) S'
H1 : is_e T
S : subst X R T S1
============================
 app S1 (abs "A" (abs "B" (var "A"))) = S'
 < S': case S'.

Subgoal 2:

Variables: X R T S1 S3 S2
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
S' : subst X R T S2
S'1 : subst X R (abs "A" (abs "B" (var "A"))) S3
============================
 app S1 (abs "A" (abs "B" (var "A"))) = app S2 S3
 < apply subst_unique to _ _ _ S S'.

Subgoal 2:

Variables: X R T S3 S2
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : subst X R T S2
S'1 : subst X R (abs "A" (abs "B" (var "A"))) S3
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 S3
 < clear S'.

Subgoal 2:

Variables: X R T S3 S2
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S'1 : subst X R (abs "A" (abs "B" (var "A"))) S3
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 S3
 < S': case S'1.

Subgoal 2.1:

Variables: R T S2
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string "A"
IsR : is_e R
H1 : is_e T
S : subst "A" R T S2
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 (abs "A" (abs "B" (var "A")))
 < search 10.

Subgoal 2.2:

Variables: X R T S2 B
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : X = "A" -> false
S'1 : subst X R (abs "B" (var "A")) B
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 (abs "A" B)
 < S': case S'1.

Subgoal 2.2.1:

Variables: R T S2
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string "B"
IsR : is_e R
H1 : is_e T
S : subst "B" R T S2
S' : "B" = "A" -> false
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 (abs "A" (abs "B" (var "A")))
 < search 10.

Subgoal 2.2.2:

Variables: X R T S2 B1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : subst X R (var "A") B1
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 (abs "A" (abs "B" B1))
 < case S'2.

Subgoal 2.2.2.1:

Variables: T S2 B1
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string "A"
IsR : is_e B1
H1 : is_e T
S : subst "A" B1 T S2
S' : "A" = "A" -> false
S'1 : "A" = "B" -> false
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 (abs "A" (abs "B" B1))
 < apply S' to _.

Subgoal 2.2.2.2:

Variables: X R T S2
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : X = "A" -> false
S'1 : X = "B" -> false
H2 : X = "A" -> false
============================
 app S2 (abs "A" (abs "B" (var "A"))) = app S2 (abs "A" (abs "B" (var "A")))
 < search 10.

Subgoal 3:

Variables: X R S S' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsE : is_e (snd T)
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) S
S' : subst X R (app T (abs "A" (abs "B" (var "B")))) S'
============================
 S = S'
 < case IsE.

Subgoal 3:

Variables: X R S S' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
S : subst X R (snd T) S
S' : subst X R (app T (abs "A" (abs "B" (var "B")))) S'
H1 : is_e T
============================
 S = S'
 < S: case S.

Subgoal 3:

Variables: X R S' T S1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
S' : subst X R (app T (abs "A" (abs "B" (var "B")))) S'
H1 : is_e T
S : subst X R T S1
============================
 app S1 (abs "A" (abs "B" (var "B"))) = S'
 < S': case S'.

Subgoal 3:

Variables: X R T S1 S3 S2
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S1
S' : subst X R T S2
S'1 : subst X R (abs "A" (abs "B" (var "B"))) S3
============================
 app S1 (abs "A" (abs "B" (var "B"))) = app S2 S3
 < apply subst_unique to _ _ _ S S'.

Subgoal 3:

Variables: X R T S3 S2
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : subst X R T S2
S'1 : subst X R (abs "A" (abs "B" (var "B"))) S3
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 S3
 < clear S'.

Subgoal 3:

Variables: X R T S3 S2
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S'1 : subst X R (abs "A" (abs "B" (var "B"))) S3
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 S3
 < S': case S'1.

Subgoal 3.1:

Variables: R T S2
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string "A"
IsR : is_e R
H1 : is_e T
S : subst "A" R T S2
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 (abs "A" (abs "B" (var "B")))
 < search 10.

Subgoal 3.2:

Variables: X R T S2 B
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : X = "A" -> false
S'1 : subst X R (abs "B" (var "B")) B
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 (abs "A" B)
 < S': case S'1.

Subgoal 3.2.1:

Variables: R T S2
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string "B"
IsR : is_e R
H1 : is_e T
S : subst "B" R T S2
S' : "B" = "A" -> false
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 (abs "A" (abs "B" (var "B")))
 < search 10.

Subgoal 3.2.2:

Variables: X R T S2 B1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : X = "A" -> false
S'1 : X = "B" -> false
S'2 : subst X R (var "B") B1
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 (abs "A" (abs "B" B1))
 < case S'2.

Subgoal 3.2.2.1:

Variables: T S2 B1
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string "B"
IsR : is_e B1
H1 : is_e T
S : subst "B" B1 T S2
S' : "B" = "A" -> false
S'1 : "B" = "B" -> false
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 (abs "A" (abs "B" B1))
 < apply S'1 to _.

Subgoal 3.2.2.2:

Variables: X R T S2
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsX : is_string X
IsR : is_e R
H1 : is_e T
S : subst X R T S2
S' : X = "A" -> false
S'1 : X = "B" -> false
H2 : X = "B" -> false
============================
 app S2 (abs "A" (abs "B" (var "B"))) = app S2 (abs "A" (abs "B" (var "B")))
 < search 10.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_eval.

Subgoal 1:

Variables: V T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsE : is_e (pair T1 T2)
Ev : eval (pair T1 T2) V
============================
 exists V',
   eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
 < case Ev.

Subgoal 1:

Variables: V T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsE : is_e (pair T1 T2)
H1 : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V
============================
 exists V',
   eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
 < search.

Subgoal 2:

Variables: V T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsE : is_e (fst T)
Ev : eval (fst T) V
============================
 exists V', eval (app T (abs "A" (abs "B" (var "A")))) V'
 < case Ev.

Subgoal 2:

Variables: V T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsE : is_e (fst T)
H1 : eval (app T (abs "A" (abs "B" (var "A")))) V
============================
 exists V', eval (app T (abs "A" (abs "B" (var "A")))) V'
 < search.

Subgoal 3:

Variables: V T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsE : is_e (snd T)
Ev : eval (snd T) V
============================
 exists V', eval (app T (abs "A" (abs "B" (var "B")))) V'
 < case Ev.

Subgoal 3:

Variables: V T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsE : is_e (snd T)
H1 : eval (app T (abs "A" (abs "B" (var "B")))) V
============================
 exists V', eval (app T (abs "A" (abs "B" (var "B")))) V'
 < search.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_eval_same.

Subgoal 1:

Variables: V V' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
IsE : is_e (pair T1 T2)
Ev : eval (pair T1 T2) V
Ev' : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
============================
 V = V'
 < case IsE.

Subgoal 1:

Variables: V V' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Ev : eval (pair T1 T2) V
Ev' : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
H1 : is_e T1
H2 : is_e T2
============================
 V = V'
 < Ev: case Ev.

Subgoal 1:

Variables: V V' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Ev' : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
H1 : is_e T1
H2 : is_e T2
Ev : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V
============================
 V = V'
 < apply eval_unique to _ Ev Ev'.

Subgoal 1.1:

Variables: V V' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Ev' : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
H1 : is_e T1
H2 : is_e T2
Ev : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V
============================
 is_e (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2)
 < search 20.

Subgoal 1:

Variables: V' T2 T1
Proj : |{e}- pair T1 T2 ~~> app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2
Ev' : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
H1 : is_e T1
H2 : is_e T2
Ev : eval (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V'
============================
 V' = V'
 < search.

Subgoal 2:

Variables: V V' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
IsE : is_e (fst T)
Ev : eval (fst T) V
Ev' : eval (app T (abs "A" (abs "B" (var "A")))) V'
============================
 V = V'
 < case IsE.

Subgoal 2:

Variables: V V' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
Ev : eval (fst T) V
Ev' : eval (app T (abs "A" (abs "B" (var "A")))) V'
H1 : is_e T
============================
 V = V'
 < Ev: case Ev.

Subgoal 2:

Variables: V V' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
Ev' : eval (app T (abs "A" (abs "B" (var "A")))) V'
H1 : is_e T
Ev : eval (app T (abs "A" (abs "B" (var "A")))) V
============================
 V = V'
 < apply eval_unique to _ Ev Ev'.

Subgoal 2.1:

Variables: V V' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
Ev' : eval (app T (abs "A" (abs "B" (var "A")))) V'
H1 : is_e T
Ev : eval (app T (abs "A" (abs "B" (var "A")))) V
============================
 is_e (app T (abs "A" (abs "B" (var "A"))))
 < search 20.

Subgoal 2:

Variables: V' T
Proj : |{e}- fst T ~~> app T (abs "A" (abs "B" (var "A")))
Ev' : eval (app T (abs "A" (abs "B" (var "A")))) V'
H1 : is_e T
Ev : eval (app T (abs "A" (abs "B" (var "A")))) V'
============================
 V' = V'
 < search.

Subgoal 3:

Variables: V V' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
IsE : is_e (snd T)
Ev : eval (snd T) V
Ev' : eval (app T (abs "A" (abs "B" (var "B")))) V'
============================
 V = V'
 < case IsE.

Subgoal 3:

Variables: V V' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
Ev : eval (snd T) V
Ev' : eval (app T (abs "A" (abs "B" (var "B")))) V'
H1 : is_e T
============================
 V = V'
 < Ev: case Ev.

Subgoal 3:

Variables: V V' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
Ev' : eval (app T (abs "A" (abs "B" (var "B")))) V'
H1 : is_e T
Ev : eval (app T (abs "A" (abs "B" (var "B")))) V
============================
 V = V'
 < apply eval_unique to _ Ev Ev'.

Subgoal 3.1:

Variables: V V' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
Ev' : eval (app T (abs "A" (abs "B" (var "B")))) V'
H1 : is_e T
Ev : eval (app T (abs "A" (abs "B" (var "B")))) V
============================
 is_e (app T (abs "A" (abs "B" (var "B"))))
 < search 20.

Subgoal 3:

Variables: V' T
Proj : |{e}- snd T ~~> app T (abs "A" (abs "B" (var "B")))
Ev' : eval (app T (abs "A" (abs "B" (var "B")))) V'
H1 : is_e T
Ev : eval (app T (abs "A" (abs "B" (var "B")))) V'
============================
 V' = V'
 < search.

Proof completed.
 < Add_Ext_Size lambda_calculus:host:eval.

Proof completed.
 < Add_Proj_Rel lambda_calculus:host:eval.

Proof completed.
 < Prove_Ext_Ind lambda_calculus:host:eval.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
============================
 <eval {P}> (pair T1 T2) V
 < apply ext_size_is_int_eval to R2.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
H1 : is_integer N2
============================
 <eval {P}> (pair T1 T2) V
 < L: apply lt_plus_one to R1 _.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
H1 : is_integer N2
L : N2 < N
============================
 <eval {P}> (pair T1 T2) V
 < apply ext_size_pos_eval to R2.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
============================
 <eval {P}> (pair T1 T2) V
 < Acc: case Acc.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <eval {P}> (pair T1 T2) V
 < A: apply Acc to _ L.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <eval {P}> (pair T1 T2) V
 < apply IH to R2 A.

Subgoal 5:

Variables: N V N2 T2 T1
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (pair T1 T2) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H3 : <eval {P}> (app (app (abs "A" (abs "B" (abs "S" (app (app (var "S") (var "A")) (var "B"))))) T1) T2) V
============================
 <eval {P}> (pair T1 T2) V
 < search.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
============================
 <eval {P}> (fst T) V
 < apply ext_size_is_int_eval to R2.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
H1 : is_integer N2
============================
 <eval {P}> (fst T) V
 < L: apply lt_plus_one to R1 _.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
H1 : is_integer N2
L : N2 < N
============================
 <eval {P}> (fst T) V
 < apply ext_size_pos_eval to R2.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
============================
 <eval {P}> (fst T) V
 < Acc: case Acc.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <eval {P}> (fst T) V
 < A: apply Acc to _ L.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <eval {P}> (fst T) V
 < apply IH to R2 A.

Subgoal 6:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (fst T) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "A")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H3 : <eval {P}> (app T (abs "A" (abs "B" (var "A")))) V
============================
 <eval {P}> (fst T) V
 < search.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
============================
 <eval {P}> (snd T) V
 < apply ext_size_is_int_eval to R2.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
H1 : is_integer N2
============================
 <eval {P}> (snd T) V
 < L: apply lt_plus_one to R1 _.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
H1 : is_integer N2
L : N2 < N
============================
 <eval {P}> (snd T) V
 < apply ext_size_pos_eval to R2.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
============================
 <eval {P}> (snd T) V
 < Acc: case Acc.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <eval {P}> (snd T) V
 < A: apply Acc to _ L.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
============================
 <eval {P}> (snd T) V
 < apply IH to R2 A.

Subgoal 7:

Variables: N V N2 T
IH : forall N E V, <eval {ES}> E V N -> acc N * -> <eval {P}> E V
IH1 : forall N E V, <eval {ES}> E V N ** -> acc N @ -> <eval {P}> E V
R : <eval {ES}> (snd T) V N @@
R1 : 1 + N2 = N
R2 : <eval {ES}> (app T (abs "A" (abs "B" (var "B")))) V N2 **
H1 : is_integer N2
L : N2 < N
H2 : 0 <= N2
Acc : forall M, 0 <= M -> M < N -> acc M *
A : acc N2 *
H3 : <eval {P}> (app T (abs "A" (abs "B" (var "B")))) V
============================
 <eval {P}> (snd T) V
 < search.

Proof completed.
Back to example home