Reasoning Details

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

Variables: E1 E2 X
Hyp : |{e}- let X E1 E2 ~~> app (abs X E2) E1
Hyp1 : is_e (let X E1 E2)
============================
 is_e (app (abs X E2) E1)
 < case Hyp1.

Variables: E1 E2 X
Hyp : |{e}- let X E1 E2 ~~> app (abs X E2) E1
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
============================
 is_e (app (abs X E2) E1)
 < search.

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 S
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (let S E1 E2) @
R1 : is_string S
R2 : is_e E1 *
R3 : is_e E2 *
============================
 <is_e {P}> (let S E1 E2)
 < apply IH to R2.

Subgoal 6:

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

Subgoal 6:

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

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_same.

Variables: E2 E3 E4 X
Hyp : |{e}- let X E3 E4 ~~> app (abs X E4) E3
Hyp1 : |{e}- let X E3 E4 ~~> E2
============================
 app (abs X E4) E3 = E2
 < case Hyp1.

Variables: E3 E4 X
Hyp : |{e}- let X E3 E4 ~~> app (abs X E4) E3
============================
 app (abs X E4) E3 = app (abs X E4) E3
 < search.

Proof completed.
 < Prove lambda_calculus:host:subst_exists.

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 (let S E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_string S
IsE2 : is_e E1 *
IsE3 : is_e E2 *
============================
 exists S1, subst X R (let S E1 E2) S1
 < 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 (let S E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_string S
IsE2 : is_e E1 *
IsE3 : is_e E2 *
H1 : subst X R E1 S1
============================
 exists S1, subst X R (let S E1 E2) S1
 < apply IH to IsE3 IsX IsR.

Subgoal 6:

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

Subgoal 6:

Variables: X R E2 E1 S S1 S2
IH : forall X R E, is_e E * -> is_string X -> is_e R -> exists S, subst X R E S
IsE : is_e (let S E1 E2) @
IsX : is_string X
IsR : is_e R
IsE1 : is_string S
IsE2 : is_e E1 *
IsE3 : is_e E2 *
H1 : subst X R E1 S1
H2 : subst X R E2 S2
Or : X = S \/ (X = S -> false)
============================
 exists S1, subst X R (let S E1 E2) S1
 < case Or.

Subgoal 6.1:

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

Subgoal 6.2:

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

Proof completed.
 < Prove lambda_calculus:host:subst_is.

Subgoal 8:

Variables: X R S1 S2 Y E2 E1
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 (let Y E1 E2)
IsX : is_string X
IsR : is_e R
S : subst X R (let Y E1 E2) (app (abs Y S2) S1) @
S1 : X = Y -> false
S2 : subst X R E1 S1 *
S3 : subst X R E2 S2 *
============================
 is_e (app (abs Y S2) S1)
 < case IsE.

Subgoal 8:

Variables: X R S1 S2 Y E2 E1
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 (let Y E1 E2) (app (abs Y S2) S1) @
S1 : X = Y -> false
S2 : subst X R E1 S1 *
S3 : subst X R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
============================
 is_e (app (abs Y S2) S1)
 < apply IH to _ _ _ S2.

Subgoal 8:

Variables: X R S1 S2 Y E2 E1
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 (let Y E1 E2) (app (abs Y S2) S1) @
S1 : X = Y -> false
S2 : subst X R E1 S1 *
S3 : subst X R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
H4 : is_e S1
============================
 is_e (app (abs Y S2) S1)
 < apply IH to _ _ _ S3.

Subgoal 8:

Variables: X R S1 S2 Y E2 E1
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 (let Y E1 E2) (app (abs Y S2) S1) @
S1 : X = Y -> false
S2 : subst X R E1 S1 *
S3 : subst X R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
H4 : is_e S1
H5 : is_e S2
============================
 is_e (app (abs Y S2) S1)
 < search.

Subgoal 9:

Variables: X R S1 E2 E1
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 (let X E1 E2)
IsX : is_string X
IsR : is_e R
S : subst X R (let X E1 E2) (app (abs X E2) S1) @
S1 : subst X R E1 S1 *
============================
 is_e (app (abs X E2) S1)
 < case IsE.

Subgoal 9:

Variables: X R S1 E2 E1
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 (let X E1 E2) (app (abs X E2) S1) @
S1 : subst X R E1 S1 *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
============================
 is_e (app (abs X E2) S1)
 < apply IH to _ _ _ S1.

Subgoal 9:

Variables: X R S1 E2 E1
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 (let X E1 E2) (app (abs X E2) S1) @
S1 : subst X R E1 S1 *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
H4 : is_e S1
============================
 is_e (app (abs X E2) S1)
 < search.

Proof completed.
 < Prove lambda_calculus:host:eval_is.

Subgoal 5:

Variables: V E11 E3 E2 E1 X
IH : forall E V, is_e E -> eval E V * -> is_e V
IsE : is_e (let X E1 E2)
Ev : eval (let X E1 E2) V @
Ev1 : eval E1 E11 *
Ev2 : subst X E11 E2 E3
Ev3 : eval E3 V *
============================
 is_e V
 < case IsE.

Subgoal 5:

Variables: V E11 E3 E2 E1 X
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (let X E1 E2) V @
Ev1 : eval E1 E11 *
Ev2 : subst X E11 E2 E3
Ev3 : eval E3 V *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
============================
 is_e V
 < apply IH to _ Ev1.

Subgoal 5:

Variables: V E11 E3 E2 E1 X
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (let X E1 E2) V @
Ev1 : eval E1 E11 *
Ev2 : subst X E11 E2 E3
Ev3 : eval E3 V *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
H4 : is_e E11
============================
 is_e V
 < apply subst_is to _ _ _ Ev2.

Subgoal 5:

Variables: V E11 E3 E2 E1 X
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (let X E1 E2) V @
Ev1 : eval E1 E11 *
Ev2 : subst X E11 E2 E3
Ev3 : eval E3 V *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
H4 : is_e E11
H5 : is_e E3
============================
 is_e V
 < apply IH to _ Ev3.

Subgoal 5:

Variables: V E11 E3 E2 E1 X
IH : forall E V, is_e E -> eval E V * -> is_e V
Ev : eval (let X E1 E2) V @
Ev1 : eval E1 E11 *
Ev2 : subst X E11 E2 E3
Ev3 : eval E3 V *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
H4 : is_e E11
H5 : is_e E3
H6 : is_e V
============================
 is_e V
 < search.

Proof completed.
 < Prove lambda_calculus:host:subst_unique.

Subgoal 8:

Variables: X R SB S1 S2 Y E2 E1
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 (let Y E1 E2)
IsX : is_string X
IsR : is_e R
SA : subst X R (let Y E1 E2) (app (abs Y S2) S1) @
SB : subst X R (let Y E1 E2) SB
SA1 : X = Y -> false
SA2 : subst X R E1 S1 *
SA3 : subst X R E2 S2 *
============================
 app (abs Y S2) S1 = SB
 < case IsE.

Subgoal 8:

Variables: X R SB S1 S2 Y E2 E1
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 (let Y E1 E2) (app (abs Y S2) S1) @
SB : subst X R (let Y E1 E2) SB
SA1 : X = Y -> false
SA2 : subst X R E1 S1 *
SA3 : subst X R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
============================
 app (abs Y S2) S1 = SB
 < SB: case SB.

Subgoal 8.1:

Variables: X R S1 S2 Y E2 E1 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 (let Y E1 E2) (app (abs Y S2) S1) @
SA1 : X = Y -> false
SA2 : subst X R E1 S1 *
SA3 : subst X R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
SB : X = Y -> false
SB1 : subst X R E1 S4
SB2 : subst X R E2 S3
============================
 app (abs Y S2) S1 = app (abs Y S3) S4
 < apply IH to _ _ _ SA2 SB1.

Subgoal 8.1:

Variables: X R S2 Y E2 E1 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 (let Y E1 E2) (app (abs Y S2) S4) @
SA1 : X = Y -> false
SA2 : subst X R E1 S4 *
SA3 : subst X R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
SB : X = Y -> false
SB1 : subst X R E1 S4
SB2 : subst X R E2 S3
============================
 app (abs Y S2) S4 = app (abs Y S3) S4
 < apply IH to _ _ _ SA3 SB2.

Subgoal 8.1:

Variables: X R Y E2 E1 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 (let Y E1 E2) (app (abs Y S3) S4) @
SA1 : X = Y -> false
SA2 : subst X R E1 S4 *
SA3 : subst X R E2 S3 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
SB : X = Y -> false
SB1 : subst X R E1 S4
SB2 : subst X R E2 S3
============================
 app (abs Y S3) S4 = app (abs Y S3) S4
 < search.

Subgoal 8.2:

Variables: R S1 S2 Y E2 E1 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 Y
IsR : is_e R
SA : subst Y R (let Y E1 E2) (app (abs Y S2) S1) @
SA1 : Y = Y -> false
SA2 : subst Y R E1 S1 *
SA3 : subst Y R E2 S2 *
H1 : is_string Y
H2 : is_e E1
H3 : is_e E2
SB : subst Y R E1 S3
============================
 app (abs Y S2) S1 = app (abs Y E2) S3
 < apply SA1 to _.

Subgoal 9:

Variables: X R SB S1 E2 E1
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 (let X E1 E2)
IsX : is_string X
IsR : is_e R
SA : subst X R (let X E1 E2) (app (abs X E2) S1) @
SB : subst X R (let X E1 E2) SB
SA1 : subst X R E1 S1 *
============================
 app (abs X E2) S1 = SB
 < case IsE.

Subgoal 9:

Variables: X R SB S1 E2 E1
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 (let X E1 E2) (app (abs X E2) S1) @
SB : subst X R (let X E1 E2) SB
SA1 : subst X R E1 S1 *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
============================
 app (abs X E2) S1 = SB
 < SB: case SB.

Subgoal 9.1:

Variables: X R S1 E2 E1 S3 S2
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 (let X E1 E2) (app (abs X E2) S1) @
SA1 : subst X R E1 S1 *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
SB : X = X -> false
SB1 : subst X R E1 S3
SB2 : subst X R E2 S2
============================
 app (abs X E2) S1 = app (abs X S2) S3
 < apply SB to _.

Subgoal 9.2:

Variables: X R S1 E2 E1 S2
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 (let X E1 E2) (app (abs X E2) S1) @
SA1 : subst X R E1 S1 *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
SB : subst X R E1 S2
============================
 app (abs X E2) S1 = app (abs X E2) S2
 < apply IH to _ _ _ SA1 SB.

Subgoal 9.2:

Variables: X R E2 E1 S2
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 (let X E1 E2) (app (abs X E2) S2) @
SA1 : subst X R E1 S2 *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
SB : subst X R E1 S2
============================
 app (abs X E2) S2 = app (abs X E2) S2
 < search.

Proof completed.
 < Prove lambda_calculus:host:eval_unique.

Subgoal 5:

Variables: VA VB E11 E3 E2 E1 X
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
IsE : is_e (let X E1 E2)
EvA : eval (let X E1 E2) VA @
EvB : eval (let X E1 E2) VB
EvA1 : eval E1 E11 *
EvA2 : subst X E11 E2 E3
EvA3 : eval E3 VA *
============================
 VA = VB
 < case IsE.

Subgoal 5:

Variables: VA VB E11 E3 E2 E1 X
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VA @
EvB : eval (let X E1 E2) VB
EvA1 : eval E1 E11 *
EvA2 : subst X E11 E2 E3
EvA3 : eval E3 VA *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
============================
 VA = VB
 < EvB: case EvB.

Subgoal 5:

Variables: VA VB E11 E3 E2 E1 X E4 E5
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VA @
EvA1 : eval E1 E11 *
EvA2 : subst X E11 E2 E3
EvA3 : eval E3 VA *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
EvB : eval E1 E4
EvB1 : subst X E4 E2 E5
EvB2 : eval E5 VB
============================
 VA = VB
 < apply IH to _ EvA1 EvB.

Subgoal 5:

Variables: VA VB E3 E2 E1 X E4 E5
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VA @
EvA1 : eval E1 E4 *
EvA2 : subst X E4 E2 E3
EvA3 : eval E3 VA *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
EvB : eval E1 E4
EvB1 : subst X E4 E2 E5
EvB2 : eval E5 VB
============================
 VA = VB
 < apply eval_is to _ EvA1.

Subgoal 5:

Variables: VA VB E3 E2 E1 X E4 E5
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VA @
EvA1 : eval E1 E4 *
EvA2 : subst X E4 E2 E3
EvA3 : eval E3 VA *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
EvB : eval E1 E4
EvB1 : subst X E4 E2 E5
EvB2 : eval E5 VB
H4 : is_e E4
============================
 VA = VB
 < apply subst_unique to _ _ _ EvA2 EvB1.

Subgoal 5:

Variables: VA VB E2 E1 X E4 E5
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VA @
EvA1 : eval E1 E4 *
EvA2 : subst X E4 E2 E5
EvA3 : eval E5 VA *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
EvB : eval E1 E4
EvB1 : subst X E4 E2 E5
EvB2 : eval E5 VB
H4 : is_e E4
============================
 VA = VB
 < apply subst_is to _ _ _ EvA2.

Subgoal 5:

Variables: VA VB E2 E1 X E4 E5
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VA @
EvA1 : eval E1 E4 *
EvA2 : subst X E4 E2 E5
EvA3 : eval E5 VA *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
EvB : eval E1 E4
EvB1 : subst X E4 E2 E5
EvB2 : eval E5 VB
H4 : is_e E4
H5 : is_e E5
============================
 VA = VB
 < apply IH to _ EvA3 EvB2.

Subgoal 5:

Variables: VB E2 E1 X E4 E5
IH : forall E VA VB, is_e E -> eval E VA * -> eval E VB -> VA = VB
EvA : eval (let X E1 E2) VB @
EvA1 : eval E1 E4 *
EvA2 : subst X E4 E2 E5
EvA3 : eval E5 VB *
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
EvB : eval E1 E4
EvB1 : subst X E4 E2 E5
EvB2 : eval E5 VB
H4 : is_e E4
H5 : is_e E5
============================
 VB = VB
 < search.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_subst.

Variables: X R S E1 E2 X1
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsE : is_e (let X1 E1 E2)
IsX : is_string X
IsR : is_e R
S : subst X R (let X1 E1 E2) S
============================
 exists S', subst X R (app (abs X1 E2) E1) S'
 < case IsE.

Variables: X R S E1 E2 X1
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
S : subst X R (let X1 E1 E2) S
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
============================
 exists S', subst X R (app (abs X1 E2) E1) S'
 < S: case S.

Subgoal 1:

Variables: X R E1 E2 X1 S1 S2
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X = X1 -> false
S1 : subst X R E1 S1
S2 : subst X R E2 S2
============================
 exists S', subst X R (app (abs X1 E2) E1) S'
 < search.

Subgoal 2:

Variables: R E1 E2 X1 S1
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : subst X1 R E1 S1
============================
 exists S', subst X1 R (app (abs X1 E2) E1) S'
 < search.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_subst_same.

Variables: X R S S' E1 E2 X1
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsE : is_e (let X1 E1 E2)
IsX : is_string X
IsR : is_e R
S : subst X R (let X1 E1 E2) S
S' : subst X R (app (abs X1 E2) E1) S'
============================
 S = S'
 < case IsE.

Variables: X R S S' E1 E2 X1
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
S : subst X R (let X1 E1 E2) S
S' : subst X R (app (abs X1 E2) E1) S'
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
============================
 S = S'
 < S: case S.

Subgoal 1:

Variables: X R S' E1 E2 X1 S1 S2
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
S' : subst X R (app (abs X1 E2) E1) S'
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X = X1 -> false
S1 : subst X R E1 S1
S2 : subst X R E2 S2
============================
 app (abs X1 S2) S1 = S'
 < S': case S'.

Subgoal 1:

Variables: X R E1 E2 X1 S1 S2 S4 S3
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X = X1 -> false
S1 : subst X R E1 S1
S2 : subst X R E2 S2
S' : subst X R (abs X1 E2) S3
S'1 : subst X R E1 S4
============================
 app (abs X1 S2) S1 = app S3 S4
 < S': case S'.

Subgoal 1.1:

Variables: R E1 E2 X1 S1 S2 S4
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X1 = X1 -> false
S1 : subst X1 R E1 S1
S2 : subst X1 R E2 S2
S'1 : subst X1 R E1 S4
============================
 app (abs X1 S2) S1 = app (abs X1 E2) S4
 < apply S to _.

Subgoal 1.2:

Variables: X R E1 E2 X1 S1 S2 S4 B
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X = X1 -> false
S1 : subst X R E1 S1
S2 : subst X R E2 S2
S'1 : subst X R E1 S4
S' : X = X1 -> false
S'2 : subst X R E2 B
============================
 app (abs X1 S2) S1 = app (abs X1 B) S4
 < apply subst_unique to _ _ _ S1 S'1.

Subgoal 1.2:

Variables: X R E1 E2 X1 S2 S4 B
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X = X1 -> false
S1 : subst X R E1 S4
S2 : subst X R E2 S2
S'1 : subst X R E1 S4
S' : X = X1 -> false
S'2 : subst X R E2 B
============================
 app (abs X1 S2) S4 = app (abs X1 B) S4
 < apply subst_unique to _ _ _ S2 S'2.

Subgoal 1.2:

Variables: X R E1 E2 X1 S4 B
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : X = X1 -> false
S1 : subst X R E1 S4
S2 : subst X R E2 B
S'1 : subst X R E1 S4
S' : X = X1 -> false
S'2 : subst X R E2 B
============================
 app (abs X1 B) S4 = app (abs X1 B) S4
 < search.

Subgoal 2:

Variables: R S' E1 E2 X1 S1
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
S' : subst X1 R (app (abs X1 E2) E1) S'
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : subst X1 R E1 S1
============================
 app (abs X1 E2) S1 = S'
 < S': case S'.

Subgoal 2:

Variables: R E1 E2 X1 S1 S3 S2
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : subst X1 R E1 S1
S' : subst X1 R (abs X1 E2) S2
S'1 : subst X1 R E1 S3
============================
 app (abs X1 E2) S1 = app S2 S3
 < S': case S'.

Subgoal 2.1:

Variables: R E1 E2 X1 S1 S3
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : subst X1 R E1 S1
S'1 : subst X1 R E1 S3
============================
 app (abs X1 E2) S1 = app (abs X1 E2) S3
 < apply subst_unique to _ _ _ S S'1.

Subgoal 2.1:

Variables: R E1 E2 X1 S3
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : subst X1 R E1 S3
S'1 : subst X1 R E1 S3
============================
 app (abs X1 E2) S3 = app (abs X1 E2) S3
 < search.

Subgoal 2.2:

Variables: R E1 E2 X1 S1 S3 B
Proj : |{e}- let X1 E1 E2 ~~> app (abs X1 E2) E1
IsX : is_string X1
IsR : is_e R
H1 : is_string X1
H2 : is_e E1
H3 : is_e E2
S : subst X1 R E1 S1
S'1 : subst X1 R E1 S3
S' : X1 = X1 -> false
S'2 : subst X1 R E2 B
============================
 app (abs X1 E2) S1 = app (abs X1 B) S3
 < apply S' to _.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_eval.

Variables: V E1 E2 X
Proj : |{e}- let X E1 E2 ~~> app (abs X E2) E1
IsE : is_e (let X E1 E2)
Ev : eval (let X E1 E2) V
============================
 exists V', eval (app (abs X E2) E1) V'
 < Ev: case Ev.

Variables: V E1 E2 X E11 E3
Proj : |{e}- let X E1 E2 ~~> app (abs X E2) E1
IsE : is_e (let X E1 E2)
Ev : eval E1 E11
Ev1 : subst X E11 E2 E3
Ev2 : eval E3 V
============================
 exists V', eval (app (abs X E2) E1) V'
 < search.

Proof completed.
 < Prove_Constraint lambda_calculus:host:proj_eval_same.

Variables: V V' E1 E2 X
Proj : |{e}- let X E1 E2 ~~> app (abs X E2) E1
IsE : is_e (let X E1 E2)
Ev : eval (let X E1 E2) V
Ev' : eval (app (abs X E2) E1) V'
============================
 V = V'
 < case IsE.

Variables: V V' E1 E2 X
Proj : |{e}- let X E1 E2 ~~> app (abs X E2) E1
Ev : eval (let X E1 E2) V
Ev' : eval (app (abs X E2) E1) V'
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
============================
 V = V'
 < Ev: case Ev.

Variables: V V' E1 E2 X E11 E3
Proj : |{e}- let X E1 E2 ~~> app (abs X E2) E1
Ev' : eval (app (abs X E2) E1) V'
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
Ev : eval E1 E11
Ev1 : subst X E11 E2 E3
Ev2 : eval E3 V
============================
 V = V'
 < Ev': case Ev'.

Variables: V V' E1 E2 X E11 E3 X1 Body V2 B
Proj : |{e}- let X E1 E2 ~~> app (abs X E2) E1
H1 : is_string X
H2 : is_e E1
H3 : is_e E2
Ev : eval E1 E11
Ev1 : subst X E11 E2 E3
Ev2 : eval E3 V
Ev' : eval (abs X E2) (abs X1 Body)
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
============================
 V = V'
 < Ev': case Ev'.

Variables: V V' E1 E11 E3 X1 Body V2 B
Proj : |{e}- let X1 E1 Body ~~> app (abs X1 Body) E1
H1 : is_string X1
H2 : is_e E1
H3 : is_e Body
Ev : eval E1 E11
Ev1 : subst X1 E11 Body E3
Ev2 : eval E3 V
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
============================
 V = V'
 < apply eval_unique to _ Ev Ev'1.

Variables: V V' E1 E3 X1 Body V2 B
Proj : |{e}- let X1 E1 Body ~~> app (abs X1 Body) E1
H1 : is_string X1
H2 : is_e E1
H3 : is_e Body
Ev : eval E1 V2
Ev1 : subst X1 V2 Body E3
Ev2 : eval E3 V
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
============================
 V = V'
 < apply eval_is to _ Ev.

Variables: V V' E1 E3 X1 Body V2 B
Proj : |{e}- let X1 E1 Body ~~> app (abs X1 Body) E1
H1 : is_string X1
H2 : is_e E1
H3 : is_e Body
Ev : eval E1 V2
Ev1 : subst X1 V2 Body E3
Ev2 : eval E3 V
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
H4 : is_e V2
============================
 V = V'
 < apply subst_unique to _ _ _ Ev1 Ev'2.

Variables: V V' E1 X1 Body V2 B
Proj : |{e}- let X1 E1 Body ~~> app (abs X1 Body) E1
H1 : is_string X1
H2 : is_e E1
H3 : is_e Body
Ev : eval E1 V2
Ev1 : subst X1 V2 Body B
Ev2 : eval B V
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
H4 : is_e V2
============================
 V = V'
 < apply subst_is to _ _ _ Ev1.

Variables: V V' E1 X1 Body V2 B
Proj : |{e}- let X1 E1 Body ~~> app (abs X1 Body) E1
H1 : is_string X1
H2 : is_e E1
H3 : is_e Body
Ev : eval E1 V2
Ev1 : subst X1 V2 Body B
Ev2 : eval B V
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
H4 : is_e V2
H5 : is_e B
============================
 V = V'
 < apply eval_unique to _ Ev2 Ev'3.

Variables: V' E1 X1 Body V2 B
Proj : |{e}- let X1 E1 Body ~~> app (abs X1 Body) E1
H1 : is_string X1
H2 : is_e E1
H3 : is_e Body
Ev : eval E1 V2
Ev1 : subst X1 V2 Body B
Ev2 : eval B V'
Ev'1 : eval E1 V2
Ev'2 : subst X1 V2 Body B
Ev'3 : eval B V'
H4 : is_e V2
H5 : is_e B
============================
 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 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
============================
 <eval {P}> (let X E1 E2) V
 < apply ext_size_is_int_eval to R3.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
============================
 <eval {P}> (let X E1 E2) V
 < apply ext_size_is_int_eval to R5.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
============================
 <eval {P}> (let X E1 E2) V
 < apply plus_integer_is_integer to _ _ R2.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
============================
 <eval {P}> (let X E1 E2) V
 < L4: apply lt_plus_one to R1 _.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
============================
 <eval {P}> (let X E1 E2) V
 < apply ext_size_pos_eval to R3.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
============================
 <eval {P}> (let X E1 E2) V
 < apply ext_size_pos_eval to R5.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
============================
 <eval {P}> (let X E1 E2) V
 < L2: assert N2 < N.

Subgoal 5.1:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
============================
 N2 < N
 < Or: apply lt_left to R2 _ _.

Subgoal 5.1:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
Or : N2 < N4 \/ N2 = N4
============================
 N2 < N
 < L: case Or.

Subgoal 5.1.1:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L : N2 < N4
============================
 N2 < N
 < apply less_integer_transitive to L L4.

Subgoal 5.1.1:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L : N2 < N4
H6 : N2 < N
============================
 N2 < N
 < search.

Subgoal 5.1.2:

Variables: N V N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <eval {ES}> E1 E11 N4 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N4
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N4
H5 : 0 <= N3
============================
 N4 < N
 < search.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
============================
 <eval {P}> (let X E1 E2) V
 < L3: assert N3 < N.

Subgoal 5.2:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
============================
 N3 < N
 < Or: apply lt_right to R2 _ _ _.

Subgoal 5.2:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
Or : N3 < N4 \/ N3 = N4
============================
 N3 < N
 < L: case Or.

Subgoal 5.2.1:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L : N3 < N4
============================
 N3 < N
 < apply less_integer_transitive to L L4.

Subgoal 5.2.1:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L : N3 < N4
H6 : N3 < N
============================
 N3 < N
 < search.

Subgoal 5.2.2:

Variables: N V N2 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N4 **
H1 : is_integer N2
H2 : is_integer N4
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N4
L2 : N2 < N
============================
 N4 < N
 < search.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L3 : N3 < N
============================
 <eval {P}> (let X E1 E2) V
 < Acc: case Acc.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L3 : N3 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <eval {P}> (let X E1 E2) V
 < A2: apply Acc to _ L2.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L3 : N3 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
============================
 <eval {P}> (let X E1 E2) V
 < A3: apply Acc to _ L3.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L3 : N3 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
A3 : acc N3 *
============================
 <eval {P}> (let X E1 E2) V
 < apply IH to R3 A2.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L3 : N3 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
A3 : acc N3 *
H6 : <eval {P}> E1 E11
============================
 <eval {P}> (let X E1 E2) V
 < apply IH to R5 A3.

Subgoal 5:

Variables: N V N2 N3 N4 E11 E3 E2 E1 X
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}> (let X E1 E2) V N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval {ES}> E1 E11 N2 **
R4 : subst X E11 E2 E3
R5 : <eval {ES}> E3 V N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : is_integer N4
L4 : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
L2 : N2 < N
L3 : N3 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
A2 : acc N2 *
A3 : acc N3 *
H6 : <eval {P}> E1 E11
H7 : <eval {P}> E3 V
============================
 <eval {P}> (let X E1 E2) V
 < search.

Proof completed.
Back to example home