< 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.