Reasoning Details

 < Module simple_imp:repeatWhile.
 < Prove_Constraint simple_imp:host:proj_e_unique.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_e_is.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_rf_unique.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_rf_is.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_c_unique.

Variables: C2 Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : |{c}- repeatWhile Body Cond ~~> C2
============================
 seq Body (while Cond Body) = C2
 < case Hyp1.

Variables: Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
============================
 seq Body (while Cond Body) = seq Body (while Cond Body)
 < search.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_c_is.

Variables: Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : is_c (repeatWhile Body Cond)
============================
 is_c (seq Body (while Cond Body))
 < case Hyp1.

Variables: Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
H1 : is_c Body
H2 : is_e Cond
============================
 is_c (seq Body (while Cond Body))
 < search.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_recFields_unique.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_recFields_is.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_ty_unique.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_ty_is.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_value_unique.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_value_is.

Proof completed.
 < Prove simple_imp:host:vars_join,
         simple_imp:host:vars_rf_join.

Proof completed.
 < Prove simple_imp:host:vars_unique,
         simple_imp:host:vars_rf_unique.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_e_vars_exist.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_e_vars.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_rf_vars_exist.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_rf_vars.

Proof completed.
 < Prove simple_imp:host:vars_is,
         simple_imp:host:vars_rf_is.

Proof completed.
 < Prove simple_imp:host:vars_exist,
         simple_imp:host:vars_rf_exist.

Proof completed.
 < Prove simple_imp:host:typeOf_unique,
         simple_imp:host:typeRecFields_unique.

Proof completed.
 < Prove simple_imp:host:typeOK_unique.

Subgoal 8:

Variables: G1 G2 GB E Cond Body
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G1 (repeatWhile Body Cond) G1 @
Ty2 : typeOK G1 (repeatWhile Body Cond) G2
Ty3 : typeOK G1 Body GB *
Ty4 : typeOf G1 E boolTy
============================
 G1 = G2
 < case Ty2.

Subgoal 8:

Variables: G2 GB E Cond Body GB1 E1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (repeatWhile Body Cond) G2 @
Ty3 : typeOK G2 Body GB *
Ty4 : typeOf G2 E boolTy
H1 : typeOK G2 Body GB1
H2 : typeOf G2 E1 boolTy
============================
 G2 = G2
 < search.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_eval_e.

Proof completed.
 < Prove simple_imp:host:eval_e_unique,
         simple_imp:host:eval_rf_unique.

Proof completed.
 < Prove simple_imp:host:update_rec_fields_unique.

Proof completed.
 < Theorem repeatWhile_projEval :
     forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2.

============================
 forall G Body Cond G1,
   eval_c G (repeatWhile Body Cond) G1 -> exists G2,
     eval_c G (seq Body (while Cond Body)) G2
 < induction on 1.

IH : forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 * -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2
============================
 forall G Body Cond G1,
   eval_c G (repeatWhile Body Cond) G1 @ -> exists G2,
     eval_c G (seq Body (while Cond Body)) G2
 < intros Ev.

Variables: G Body Cond G1
IH : forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 * -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2
Ev : eval_c G (repeatWhile Body Cond) G1 @
============================
 exists G2, eval_c G (seq Body (while Cond Body)) G2
 < Ev: case Ev (keep).

Subgoal 1:

Variables: G Body Cond G1 G2
IH : forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 * -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2
Ev : eval_c G (repeatWhile Body Cond) G1 @
Ev1 : eval_c G Body G2 *
Ev2 : eval_e G2 Cond trueVal
Ev3 : eval_c G2 (repeatWhile Body Cond) G1 *
============================
 exists G2, eval_c G (seq Body (while Cond Body)) G2
 < EvSeq: apply IH to Ev3.

Subgoal 1:

Variables: G Body Cond G1 G2 G3
IH : forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 * -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2
Ev : eval_c G (repeatWhile Body Cond) G1 @
Ev1 : eval_c G Body G2 *
Ev2 : eval_e G2 Cond trueVal
Ev3 : eval_c G2 (repeatWhile Body Cond) G1 *
EvSeq : eval_c G2 (seq Body (while Cond Body)) G3
============================
 exists G2, eval_c G (seq Body (while Cond Body)) G2
 < EvSeq: case EvSeq.

Subgoal 1:

Variables: G Body Cond G1 G2 G3 G4
IH : forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 * -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2
Ev : eval_c G (repeatWhile Body Cond) G1 @
Ev1 : eval_c G Body G2 *
Ev2 : eval_e G2 Cond trueVal
Ev3 : eval_c G2 (repeatWhile Body Cond) G1 *
EvSeq : eval_c G2 Body G4
EvSeq1 : eval_c G4 (while Cond Body) G3
============================
 exists G2, eval_c G (seq Body (while Cond Body)) G2
 < search.

Subgoal 2:

Variables: G Body Cond G1
IH : forall G Body Cond G1,
       eval_c G (repeatWhile Body Cond) G1 * -> exists G2,
         eval_c G (seq Body (while Cond Body)) G2
Ev : eval_c G (repeatWhile Body Cond) G1 @
Ev1 : eval_c G Body G1 *
Ev2 : eval_e G1 Cond falseVal
============================
 exists G2, eval_c G (seq Body (while Cond Body)) G2
 < search.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_c_eval.

Variables: G G2 Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : eval_c G (repeatWhile Body Cond) G2
============================
 exists G', eval_c G (seq Body (while Cond Body)) G'
 < apply repeatWhile_projEval to Hyp1.

Variables: G G2 Body Cond G1
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : eval_c G (repeatWhile Body Cond) G2
H1 : eval_c G (seq Body (while Cond Body)) G1
============================
 exists G', eval_c G (seq Body (while Cond Body)) G'
 < search.

Proof completed.
 < Add_Ext_Size simple_imp:host:eval_c.

Proof completed.
 < Add_Proj_Rel simple_imp:host:eval_c.

Proof completed.
 < Theorem RW_to_SW :
     forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N.

============================
 forall C B EG EG' N,
   <eval_c {ES}> EG (repeatWhile B C) EG' N -> exists N',
     <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < induction on 1.

IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
============================
 forall C B EG EG' N,
   <eval_c {ES}> EG (repeatWhile B C) EG' N @ -> exists N',
     <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < intros EvalRep.

Variables: C B EG EG' N
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
EvalRep : <eval_c {ES}> EG (repeatWhile B C) EG' N @
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < Ev: case EvalRep.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < SubSeq: apply IH to Ev4.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N'
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq : <eval_c {ES}> G1 (seq B (while C B)) EG' N'
SubSeq1 : N' < N3
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < EvSub: case SubSeq.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < IsN8: apply ext_size_is_int_eval_c to EvSub1.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < IsN9: apply ext_size_is_int_eval_c to EvSub2.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < IsN': apply plus_integer_is_integer to _ _ EvSub.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < IsN5: apply ext_size_is_int_eval_c to Ev2.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < N5+N': apply plus_integer_total to IsN5 IsN'.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < exists N6.

Subgoal 1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
============================
 <eval_c {ES}> EG (seq B (while C B)) EG' N6 /\ N6 < N
 < split.

Subgoal 1.1:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
============================
 <eval_c {ES}> EG (seq B (while C B)) EG' N6
 < search.

Subgoal 1.2:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
============================
 N6 < N
 < IsN6: apply ext_size_is_int_eval_c to Ev4.

Subgoal 1.2:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
IsN6 : is_integer N3
============================
 N6 < N
 < IsN7: apply plus_integer_is_integer to _ _ Ev1.

Subgoal 1.2:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
IsN6 : is_integer N3
IsN7 : is_integer N4
============================
 N6 < N
 < LN7N1: apply lt_plus_one to Ev _.

Subgoal 1.2:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
IsN6 : is_integer N3
IsN7 : is_integer N4
LN7N1 : N4 < N
============================
 N6 < N
 < LN10N7: apply less_sums to N5+N' Ev1 _ _.

Subgoal 1.2:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
IsN6 : is_integer N3
IsN7 : is_integer N4
LN7N1 : N4 < N
LN10N7 : N6 < N4
============================
 N6 < N
 < apply less_integer_transitive to LN10N7 LN7N1.

Subgoal 1.2:

Variables: C B EG EG' N N2 N3 N4 G1 N' N1 N5 G2 N6
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N4 = N
Ev1 : N2 + N3 = N4
Ev2 : <eval_c {ES}> EG B G1 N2 *
Ev3 : eval_e G1 C trueVal
Ev4 : <eval_c {ES}> G1 (repeatWhile B C) EG' N3 *
SubSeq1 : N' < N3
EvSub : N1 + N5 = N'
EvSub1 : <eval_c {ES}> G1 B G2 N1
EvSub2 : <eval_c {ES}> G2 (while C B) EG' N5
IsN8 : is_integer N1
IsN9 : is_integer N5
IsN' : is_integer N'
IsN5 : is_integer N2
N5+N' : N2 + N' = N6
IsN6 : is_integer N3
IsN7 : is_integer N4
LN7N1 : N4 < N
LN10N7 : N6 < N4
H1 : N6 < N
============================
 N6 < N
 < search.

Subgoal 2:

Variables: C B EG EG' N N2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N2 = N
Ev1 : <eval_c {ES}> EG B EG' N2 *
Ev2 : eval_e EG' C falseVal
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < IsN5: apply ext_size_is_int_eval_c to Ev1.

Subgoal 2:

Variables: C B EG EG' N N2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N2 = N
Ev1 : <eval_c {ES}> EG B EG' N2 *
Ev2 : eval_e EG' C falseVal
IsN5 : is_integer N2
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < LN5N1: apply lt_plus_one to Ev _.

Subgoal 2:

Variables: C B EG EG' N N2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N2 = N
Ev1 : <eval_c {ES}> EG B EG' N2 *
Ev2 : eval_e EG' C falseVal
IsN5 : is_integer N2
LN5N1 : N2 < N
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < N5+0: apply plus_integer_total to IsN5 _ with
           N2 = 0.

Subgoal 2:

Variables: C B EG EG' N N2 N3
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N2 = N
Ev1 : <eval_c {ES}> EG B EG' N2 *
Ev2 : eval_e EG' C falseVal
IsN5 : is_integer N2
LN5N1 : N2 < N
N5+0 : N2 + 0 = N3
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < apply plus_zero_right to N5+0.

Subgoal 2:

Variables: C B EG EG' N N2
IH : forall C B EG EG' N,
       <eval_c {ES}> EG (repeatWhile B C) EG' N * -> exists N',
         <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
Ev : 1 + N2 = N
Ev1 : <eval_c {ES}> EG B EG' N2 *
Ev2 : eval_e EG' C falseVal
IsN5 : is_integer N2
LN5N1 : N2 < N
N5+0 : N2 + 0 = N2
============================
 exists N', <eval_c {ES}> EG (seq B (while C B)) EG' N' /\ N' < N
 < search.

Proof completed.
 < Prove_Ext_Ind simple_imp:host:eval_c.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
Acc : acc N @
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < Acc: case Acc.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < IsN2: apply ext_size_is_int_eval_c to R3.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < IsN3: apply ext_size_is_int_eval_c to R5.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < IsN4: apply plus_integer_is_integer to _ _ R2.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < PosN2: apply ext_size_pos_eval_c to R3.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < PosN3: apply ext_size_pos_eval_c to R5.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < LN4N: apply lt_plus_one to R1 _.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < LN2N: assert N2 < N.

Subgoal 10.1:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
============================
 N2 < N
 < OrN2: apply lt_left to R2 _ _.

Subgoal 10.1:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
OrN2 : N2 < N4 \/ N2 = N4
============================
 N2 < N
 < L: case OrN2.

Subgoal 10.1.1:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
L : N2 < N4
============================
 N2 < N
 < apply less_integer_transitive to L LN4N.

Subgoal 10.1.1:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
L : N2 < N4
H1 : N2 < N
============================
 N2 < N
 < search.

Subgoal 10.1.2:

Variables: N G G1 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N4 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N4 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N4
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N4
PosN3 : 0 <= N3
LN4N : N4 < N
============================
 N4 < N
 < search.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < LN3N: assert N3 < N.

Subgoal 10.2:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
============================
 N3 < N
 < OrN3: apply lt_right to R2 _ _ _.

Subgoal 10.2:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
OrN3 : N3 < N4 \/ N3 = N4
============================
 N3 < N
 < L: case OrN3.

Subgoal 10.2.1:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
L : N3 < N4
============================
 N3 < N
 < apply less_integer_transitive to L LN4N.

Subgoal 10.2.1:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
L : N3 < N4
H1 : N3 < N
============================
 N3 < N
 < search.

Subgoal 10.2.2:

Variables: N G G1 N2 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N4 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N4 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N4
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N4
LN4N : N4 < N
LN2N : N2 < N
============================
 N4 < N
 < search.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < AccN2: apply Acc to _ LN2N.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < AccN3: apply Acc to _ LN3N.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < EvalTBody: apply IH to R3 AccN2.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < EvalTRep: apply IH to R5 AccN3.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < Proj: assert |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body).

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < SW: apply RW_to_SW to R5.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N'
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < LN'N: apply less_integer_transitive to SW1 LN3N.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N'
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < L0N': apply ext_size_pos_eval_c to SW.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N'
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
L0N' : 0 <= N'
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < AccN': apply Acc to _ LN'N.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N'
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
L0N' : 0 <= N'
AccN' : acc N' *
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < EvalTSeq: apply IH to SW AccN'.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N'
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
L0N' : 0 <= N'
AccN' : acc N' *
EvalTSeq : <eval_c {P}> G2 (seq Body (while Cond Body)) G1
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < EvalTParts: case EvalTSeq.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N' G3
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
L0N' : 0 <= N'
AccN' : acc N' *
EvalTParts : <eval_c {P}> G2 Body G3
EvalTParts1 : <eval_c {P}> G3 (while Cond Body) G1
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < unfold .

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N' G3
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
L0N' : 0 <= N'
AccN' : acc N' *
EvalTParts : <eval_c {P}> G2 Body G3
EvalTParts1 : <eval_c {P}> G3 (while Cond Body) G1
============================
 exists T G2,
   (<eval_c {P}> G Body G2 /\
   (eval_e G2 Cond trueVal /\ <eval_c {P}> G2 (repeatWhile Body Cond) G1)) /\
   (|{c}- repeatWhile Body Cond ~~> T /\ <eval_c {P}> G T G1)
 < exists seq Body (while Cond Body),
   G2.

Subgoal 10:

Variables: N G G1 N2 N3 N4 G2 Cond Body N' G3
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : eval_e G2 Cond trueVal
R5 : <eval_c {ES}> G2 (repeatWhile Body Cond) G1 N3 **
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
PosN2 : 0 <= N2
PosN3 : 0 <= N3
LN4N : N4 < N
LN2N : N2 < N
LN3N : N3 < N
AccN2 : acc N2 *
AccN3 : acc N3 *
EvalTBody : <eval_c {P}> G Body G2
EvalTRep : <eval_c {P}> G2 (repeatWhile Body Cond) G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
SW : <eval_c {ES}> G2 (seq Body (while Cond Body)) G1 N'
SW1 : N' < N3
LN'N : N' < N
L0N' : 0 <= N'
AccN' : acc N' *
EvalTParts : <eval_c {P}> G2 Body G3
EvalTParts1 : <eval_c {P}> G3 (while Cond Body) G1
============================
 (<eval_c {P}> G Body G2 /\
 (eval_e G2 Cond trueVal /\ <eval_c {P}> G2 (repeatWhile Body Cond) G1)) /\
 (|{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body) /\
 <eval_c {P}> G (seq Body (while Cond Body)) G1)
 < search.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
Acc : acc N @
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < Acc: case Acc.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < L0N2: apply ext_size_pos_eval_c to R2.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
L0N2 : 0 <= N2
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < IsN2: apply ext_size_is_int_eval_c to R2.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
L0N2 : 0 <= N2
IsN2 : is_integer N2
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < LN2N: apply lt_plus_one to R1 _.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
L0N2 : 0 <= N2
IsN2 : is_integer N2
LN2N : N2 < N
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < AccN2: apply Acc to _ LN2N.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
L0N2 : 0 <= N2
IsN2 : is_integer N2
LN2N : N2 < N
AccN2 : acc N2 *
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < EvalTBody: apply IH to R2 AccN2.

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
L0N2 : 0 <= N2
IsN2 : is_integer N2
LN2N : N2 < N
AccN2 : acc N2 *
EvalTBody : <eval_c {P}> G Body G1
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < Proj: assert |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body).

Subgoal 11:

Variables: N G G1 N2 Cond Body
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
        <eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (repeatWhile Body Cond) G1 N @@
R1 : 1 + N2 = N
R2 : <eval_c {ES}> G Body G1 N2 **
R3 : eval_e G1 Cond falseVal
Acc : forall M, 0 <= M -> M < N -> acc M *
L0N2 : 0 <= N2
IsN2 : is_integer N2
LN2N : N2 < N
AccN2 : acc N2 *
EvalTBody : <eval_c {P}> G Body G1
Proj : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
============================
 <eval_c {P}> G (repeatWhile Body Cond) G1
 < search 3.

Proof completed.
 < Prove simple_imp:host:eval_c_unique.

Subgoal 10:

Variables: G G1 G2 G3 Cond Body
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev2 : eval_c G (repeatWhile Body Cond) G2
Ev3 : eval_c G Body G3 *
Ev4 : eval_e G3 Cond trueVal
Ev5 : eval_c G3 (repeatWhile Body Cond) G1 *
============================
 G1 = G2
 < Ev2: case Ev2.

Subgoal 10.1:

Variables: G G1 G2 G3 Cond Body G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev3 : eval_c G Body G3 *
Ev4 : eval_e G3 Cond trueVal
Ev5 : eval_c G3 (repeatWhile Body Cond) G1 *
Ev2 : eval_c G Body G4
Ev6 : eval_e G4 Cond trueVal
Ev7 : eval_c G4 (repeatWhile Body Cond) G2
============================
 G1 = G2
 < apply IH to Ev3 Ev2.

Subgoal 10.1:

Variables: G G1 G2 Cond Body G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev3 : eval_c G Body G4 *
Ev4 : eval_e G4 Cond trueVal
Ev5 : eval_c G4 (repeatWhile Body Cond) G1 *
Ev2 : eval_c G Body G4
Ev6 : eval_e G4 Cond trueVal
Ev7 : eval_c G4 (repeatWhile Body Cond) G2
============================
 G1 = G2
 < apply IH to Ev5 Ev7.

Subgoal 10.1:

Variables: G G2 Cond Body G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G2 @
Ev3 : eval_c G Body G4 *
Ev4 : eval_e G4 Cond trueVal
Ev5 : eval_c G4 (repeatWhile Body Cond) G2 *
Ev2 : eval_c G Body G4
Ev6 : eval_e G4 Cond trueVal
Ev7 : eval_c G4 (repeatWhile Body Cond) G2
============================
 G2 = G2
 < search.

Subgoal 10.2:

Variables: G G1 G2 G3 Cond Body
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev3 : eval_c G Body G3 *
Ev4 : eval_e G3 Cond trueVal
Ev5 : eval_c G3 (repeatWhile Body Cond) G1 *
Ev2 : eval_c G Body G2
Ev6 : eval_e G2 Cond falseVal
============================
 G1 = G2
 < apply IH to Ev3 Ev2.

Subgoal 10.2:

Variables: G G1 G2 Cond Body
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev3 : eval_c G Body G2 *
Ev4 : eval_e G2 Cond trueVal
Ev5 : eval_c G2 (repeatWhile Body Cond) G1 *
Ev2 : eval_c G Body G2
Ev6 : eval_e G2 Cond falseVal
============================
 G1 = G2
 < apply eval_e_unique to Ev4 Ev6.

Subgoal 11:

Variables: G G1 G2 Cond Body
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev2 : eval_c G (repeatWhile Body Cond) G2
Ev3 : eval_c G Body G1 *
Ev4 : eval_e G1 Cond falseVal
============================
 G1 = G2
 < Ev2: case Ev2.

Subgoal 11.1:

Variables: G G1 G2 Cond Body G3
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev3 : eval_c G Body G1 *
Ev4 : eval_e G1 Cond falseVal
Ev2 : eval_c G Body G3
Ev5 : eval_e G3 Cond trueVal
Ev6 : eval_c G3 (repeatWhile Body Cond) G2
============================
 G1 = G2
 < apply IH to Ev3 Ev2.

Subgoal 11.1:

Variables: G G2 Cond Body G3
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G3 @
Ev3 : eval_c G Body G3 *
Ev4 : eval_e G3 Cond falseVal
Ev2 : eval_c G Body G3
Ev5 : eval_e G3 Cond trueVal
Ev6 : eval_c G3 (repeatWhile Body Cond) G2
============================
 G3 = G2
 < apply eval_e_unique to Ev4 Ev5.

Subgoal 11.2:

Variables: G G1 G2 Cond Body
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G1 @
Ev3 : eval_c G Body G1 *
Ev4 : eval_e G1 Cond falseVal
Ev2 : eval_c G Body G2
Ev5 : eval_e G2 Cond falseVal
============================
 G1 = G2
 < apply IH to Ev3 Ev2.

Subgoal 11.2:

Variables: G G2 Cond Body
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (repeatWhile Body Cond) G2 @
Ev3 : eval_c G Body G2 *
Ev4 : eval_e G2 Cond falseVal
Ev2 : eval_c G Body G2
Ev5 : eval_e G2 Cond falseVal
============================
 G2 = G2
 < search.

Proof completed.
 < Theorem repeatWhile_projSame :
     forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2.

============================
 forall G Body Cond G1 G2,
   eval_c G (repeatWhile Body Cond) G1 -> eval_c G (seq Body (while Cond Body)) G2 ->
   G1 = G2
 < induction on 1.

IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
============================
 forall G Body Cond G1 G2,
   eval_c G (repeatWhile Body Cond) G1 @ -> eval_c G (seq Body (while Cond Body)) G2 ->
   G1 = G2
 < intros EvRW EvSW.

Variables: G Body Cond G1 G2
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvSW : eval_c G (seq Body (while Cond Body)) G2
============================
 G1 = G2
 < EvRW: case EvRW (keep).

Subgoal 1:

Variables: G Body Cond G1 G2 G3
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvSW : eval_c G (seq Body (while Cond Body)) G2
EvRW1 : eval_c G Body G3 *
EvRW2 : eval_e G3 Cond trueVal
EvRW3 : eval_c G3 (repeatWhile Body Cond) G1 *
============================
 G1 = G2
 < EvSW: case EvSW.

Subgoal 1:

Variables: G Body Cond G1 G2 G3 G4
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvRW1 : eval_c G Body G3 *
EvRW2 : eval_e G3 Cond trueVal
EvRW3 : eval_c G3 (repeatWhile Body Cond) G1 *
EvSW : eval_c G Body G4
EvSW1 : eval_c G4 (while Cond Body) G2
============================
 G1 = G2
 < apply eval_c_unique to EvRW1 EvSW.

Subgoal 1:

Variables: G Body Cond G1 G2 G4
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvRW1 : eval_c G Body G4 *
EvRW2 : eval_e G4 Cond trueVal
EvRW3 : eval_c G4 (repeatWhile Body Cond) G1 *
EvSW : eval_c G Body G4
EvSW1 : eval_c G4 (while Cond Body) G2
============================
 G1 = G2
 < EvW': case EvSW1.

Subgoal 1.1:

Variables: G Body Cond G1 G2
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvRW1 : eval_c G Body G2 *
EvRW2 : eval_e G2 Cond trueVal
EvRW3 : eval_c G2 (repeatWhile Body Cond) G1 *
EvSW : eval_c G Body G2
EvW' : eval_e G2 Cond falseVal
============================
 G1 = G2
 < apply eval_e_unique to EvRW2 EvW'.

Subgoal 1.2:

Variables: G Body Cond G1 G2 G4 G5
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvRW1 : eval_c G Body G4 *
EvRW2 : eval_e G4 Cond trueVal
EvRW3 : eval_c G4 (repeatWhile Body Cond) G1 *
EvSW : eval_c G Body G4
EvW' : eval_e G4 Cond trueVal
EvW'1 : eval_c G4 Body G5
EvW'2 : eval_c G5 (while Cond Body) G2
============================
 G1 = G2
 < EvSeq: assert eval_c G4 (seq Body (while Cond Body)) G2.

Subgoal 1.2:

Variables: G Body Cond G1 G2 G4 G5
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvRW1 : eval_c G Body G4 *
EvRW2 : eval_e G4 Cond trueVal
EvRW3 : eval_c G4 (repeatWhile Body Cond) G1 *
EvSW : eval_c G Body G4
EvW' : eval_e G4 Cond trueVal
EvW'1 : eval_c G4 Body G5
EvW'2 : eval_c G5 (while Cond Body) G2
EvSeq : eval_c G4 (seq Body (while Cond Body)) G2
============================
 G1 = G2
 < apply IH to EvRW3 EvSeq.

Subgoal 1.2:

Variables: G Body Cond G2 G4 G5
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G2 @
EvRW1 : eval_c G Body G4 *
EvRW2 : eval_e G4 Cond trueVal
EvRW3 : eval_c G4 (repeatWhile Body Cond) G2 *
EvSW : eval_c G Body G4
EvW' : eval_e G4 Cond trueVal
EvW'1 : eval_c G4 Body G5
EvW'2 : eval_c G5 (while Cond Body) G2
EvSeq : eval_c G4 (seq Body (while Cond Body)) G2
============================
 G2 = G2
 < search.

Subgoal 2:

Variables: G Body Cond G1 G2
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvSW : eval_c G (seq Body (while Cond Body)) G2
EvRW1 : eval_c G Body G1 *
EvRW2 : eval_e G1 Cond falseVal
============================
 G1 = G2
 < EvSW: case EvSW.

Subgoal 2:

Variables: G Body Cond G1 G2 G3
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G1 @
EvRW1 : eval_c G Body G1 *
EvRW2 : eval_e G1 Cond falseVal
EvSW : eval_c G Body G3
EvSW1 : eval_c G3 (while Cond Body) G2
============================
 G1 = G2
 < apply eval_c_unique to EvRW1 EvSW.

Subgoal 2:

Variables: G Body Cond G2 G3
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G3 @
EvRW1 : eval_c G Body G3 *
EvRW2 : eval_e G3 Cond falseVal
EvSW : eval_c G Body G3
EvSW1 : eval_c G3 (while Cond Body) G2
============================
 G3 = G2
 < EvW: case EvSW1.

Subgoal 2.1:

Variables: G Body Cond G2
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G2 @
EvRW1 : eval_c G Body G2 *
EvRW2 : eval_e G2 Cond falseVal
EvSW : eval_c G Body G2
EvW : eval_e G2 Cond falseVal
============================
 G2 = G2
 < search.

Subgoal 2.2:

Variables: G Body Cond G2 G3 G4
IH : forall G Body Cond G1 G2,
       eval_c G (repeatWhile Body Cond) G1 * -> eval_c G (seq Body (while Cond Body)) G2 ->
       G1 = G2
EvRW : eval_c G (repeatWhile Body Cond) G3 @
EvRW1 : eval_c G Body G3 *
EvRW2 : eval_e G3 Cond falseVal
EvSW : eval_c G Body G3
EvW : eval_e G3 Cond trueVal
EvW1 : eval_c G3 Body G4
EvW2 : eval_c G4 (while Cond Body) G2
============================
 G3 = G2
 < apply eval_e_unique to EvRW2 EvW.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_c_eval_results.

Variables: G G1 G2 X V Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : eval_c G (repeatWhile Body Cond) G1
Hyp2 : eval_c G (seq Body (while Cond Body)) G2
Hyp3 : lookup G1 X V
============================
 lookup G2 X V
 < apply repeatWhile_projSame to Hyp1 Hyp2.

Variables: G G2 X V Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : eval_c G (repeatWhile Body Cond) G2
Hyp2 : eval_c G (seq Body (while Cond Body)) G2
Hyp3 : lookup G2 X V
============================
 lookup G2 X V
 < search.

Proof completed.
 < Prove_Constraint simple_imp:host:proj_c_eval_results_back.

Variables: G G1 G2 X V Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : eval_c G (repeatWhile Body Cond) G1
Hyp2 : eval_c G (seq Body (while Cond Body)) G2
Hyp3 : lookup G2 X V
============================
 lookup G1 X V
 < apply repeatWhile_projSame to Hyp1 Hyp2.

Variables: G G2 X V Body Cond
Hyp : |{c}- repeatWhile Body Cond ~~> seq Body (while Cond Body)
Hyp1 : eval_c G (repeatWhile Body Cond) G2
Hyp2 : eval_c G (seq Body (while Cond Body)) G2
Hyp3 : lookup G2 X V
============================
 lookup G2 X V
 < search.

Proof completed.
 < Prove simple_imp:host:vars_eval_same_result,
         simple_imp:host:vars_equal_rf_same_result.

Proof completed.
Back to example home